writr 1.9.12 → 2.0.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 (133) hide show
  1. package/README.md +76 -135
  2. package/bin/writr.mjs +8 -0
  3. package/dist/builder.d.ts +33 -0
  4. package/dist/builder.js +181 -0
  5. package/dist/console.d.ts +22 -0
  6. package/dist/console.js +120 -0
  7. package/dist/github.d.ts +22 -0
  8. package/dist/github.js +74 -0
  9. package/dist/helpers/markdown.d.ts +10 -0
  10. package/dist/helpers/markdown.js +24 -0
  11. package/dist/helpers.d.ts +7 -0
  12. package/dist/helpers.js +58 -0
  13. package/dist/options.d.ts +12 -0
  14. package/dist/options.js +47 -0
  15. package/dist/writr.d.ts +23 -0
  16. package/dist/writr.js +153 -0
  17. package/init/favicon.svg +1 -0
  18. package/init/logo.png +0 -0
  19. package/init/variables.css +30 -0
  20. package/init/writr.config.cjs +10 -0
  21. package/package.json +44 -66
  22. package/template/css/highlight/highlight.min.js +1433 -0
  23. package/template/css/highlight/styles/base16/dracula.min.css +7 -0
  24. package/template/css/home.css +307 -0
  25. package/template/css/index.css +919 -0
  26. package/template/includes/footer.hbs +10 -0
  27. package/template/includes/header.hbs +17 -0
  28. package/template/includes/landing/content.hbs +63 -0
  29. package/template/includes/landing/hero.hbs +3 -0
  30. package/template/includes/scripts.hbs +4 -0
  31. package/template/index.hbs +16 -0
  32. package/template/releases.hbs +45 -0
  33. package/bin/writr.js +0 -7
  34. package/dist/cache.d.ts +0 -18
  35. package/dist/cache.js +0 -70
  36. package/dist/cache.js.map +0 -1
  37. package/dist/config.d.ts +0 -29
  38. package/dist/config.js +0 -104
  39. package/dist/config.js.map +0 -1
  40. package/dist/data/dataProviderInterface.d.ts +0 -12
  41. package/dist/data/dataProviderInterface.js +0 -2
  42. package/dist/data/dataProviderInterface.js.map +0 -1
  43. package/dist/data/dataService.d.ts +0 -19
  44. package/dist/data/dataService.js +0 -130
  45. package/dist/data/dataService.js.map +0 -1
  46. package/dist/data/fileDataProvider.d.ts +0 -20
  47. package/dist/data/fileDataProvider.js +0 -132
  48. package/dist/data/fileDataProvider.js.map +0 -1
  49. package/dist/generator.d.ts +0 -8
  50. package/dist/generator.js +0 -54
  51. package/dist/generator.js.map +0 -1
  52. package/dist/index.d.ts +0 -8
  53. package/dist/index.js +0 -80
  54. package/dist/index.js.map +0 -1
  55. package/dist/log.d.ts +0 -6
  56. package/dist/log.js +0 -13
  57. package/dist/log.js.map +0 -1
  58. package/dist/migrate/ghostMigrationProvider.d.ts +0 -9
  59. package/dist/migrate/ghostMigrationProvider.js +0 -65
  60. package/dist/migrate/ghostMigrationProvider.js.map +0 -1
  61. package/dist/migrate/jekyllMigrationProvider.d.ts +0 -4
  62. package/dist/migrate/jekyllMigrationProvider.js +0 -11
  63. package/dist/migrate/jekyllMigrationProvider.js.map +0 -1
  64. package/dist/migrate/mediumMigrationProvider.d.ts +0 -7
  65. package/dist/migrate/mediumMigrationProvider.js +0 -26
  66. package/dist/migrate/mediumMigrationProvider.js.map +0 -1
  67. package/dist/migrate/migrationProviderInterface.d.ts +0 -3
  68. package/dist/migrate/migrationProviderInterface.js +0 -2
  69. package/dist/migrate/migrationProviderInterface.js.map +0 -1
  70. package/dist/migrate/wordpressMigrationProvider.d.ts +0 -12
  71. package/dist/migrate/wordpressMigrationProvider.js +0 -103
  72. package/dist/migrate/wordpressMigrationProvider.js.map +0 -1
  73. package/dist/migrate.d.ts +0 -6
  74. package/dist/migrate.js +0 -34
  75. package/dist/migrate.js.map +0 -1
  76. package/dist/post.d.ts +0 -31
  77. package/dist/post.js +0 -189
  78. package/dist/post.js.map +0 -1
  79. package/dist/render/atomRenderProvider.d.ts +0 -8
  80. package/dist/render/atomRenderProvider.js +0 -51
  81. package/dist/render/atomRenderProvider.js.map +0 -1
  82. package/dist/render/htmRenderlProvider.d.ts +0 -14
  83. package/dist/render/htmRenderlProvider.js +0 -117
  84. package/dist/render/htmRenderlProvider.js.map +0 -1
  85. package/dist/render/imageRenderProvider.d.ts +0 -8
  86. package/dist/render/imageRenderProvider.js +0 -15
  87. package/dist/render/imageRenderProvider.js.map +0 -1
  88. package/dist/render/jsonRenderProvider.d.ts +0 -8
  89. package/dist/render/jsonRenderProvider.js +0 -24
  90. package/dist/render/jsonRenderProvider.js.map +0 -1
  91. package/dist/render/renderProviderInterface.d.ts +0 -5
  92. package/dist/render/renderProviderInterface.js +0 -2
  93. package/dist/render/renderProviderInterface.js.map +0 -1
  94. package/dist/serve.d.ts +0 -16
  95. package/dist/serve.js +0 -29
  96. package/dist/serve.js.map +0 -1
  97. package/dist/storage/fileStorageProvider.d.ts +0 -10
  98. package/dist/storage/fileStorageProvider.js +0 -62
  99. package/dist/storage/fileStorageProvider.js.map +0 -1
  100. package/dist/storage/storageProviderInterface.d.ts +0 -8
  101. package/dist/storage/storageProviderInterface.js +0 -2
  102. package/dist/storage/storageProviderInterface.js.map +0 -1
  103. package/dist/storage/storageService.d.ts +0 -12
  104. package/dist/storage/storageService.js +0 -28
  105. package/dist/storage/storageService.js.map +0 -1
  106. package/dist/tag.d.ts +0 -9
  107. package/dist/tag.js +0 -34
  108. package/dist/tag.js.map +0 -1
  109. package/dist/utils/parser.d.ts +0 -5
  110. package/dist/utils/parser.js +0 -37
  111. package/dist/utils/parser.js.map +0 -1
  112. package/dist/utils/setup.d.ts +0 -8
  113. package/dist/utils/setup.js +0 -75
  114. package/dist/utils/setup.js.map +0 -1
  115. package/init/article-complex.md +0 -40
  116. package/init/article-ejs.md +0 -40
  117. package/init/article-unpublished.md +0 -11
  118. package/init/article1-simple.md +0 -13
  119. package/init/article1.md +0 -11
  120. package/init/article2.md +0 -14
  121. package/init/big-content.md +0 -11
  122. package/init/config.json +0 -9
  123. package/init/images/Introducing Docula 1.png +0 -0
  124. package/init/images/Introducing Docula 2.jpeg +0 -0
  125. package/init/images/Introducing Docula 3.png +0 -0
  126. package/init/images/Introducing Docula 4.png +0 -0
  127. package/init/permalink-test.md +0 -13
  128. package/init/templates/index.hjs +0 -13
  129. package/init/templates/partials/header.hjs +0 -2
  130. package/init/templates/post.hjs +0 -19
  131. package/init/templates/post2.hjs +0 -17
  132. package/init/templates/post3.ejs +0 -7
  133. package/init/templates/tag.hjs +0 -9
@@ -0,0 +1,120 @@
1
+ import path from 'node:path';
2
+ import process from 'node:process';
3
+ export class WritrConsole {
4
+ log(message) {
5
+ console.log(message);
6
+ }
7
+ error(message) {
8
+ console.error(message);
9
+ }
10
+ warn(message) {
11
+ console.warn(message);
12
+ }
13
+ printHelp() {
14
+ console.log(' Usage: writr [command] [arguments]');
15
+ console.log();
16
+ console.log(' Commands:');
17
+ console.log(' init Initialize a new project');
18
+ console.log(' build Build the project. By default just npx writr will build the project if it finds a ./site folder');
19
+ console.log(' serve Serve the project as a local website');
20
+ console.log(' help Print this help');
21
+ console.log(' version Print the version');
22
+ console.log();
23
+ console.log(' Arguments Build:');
24
+ console.log(' -w, --watch watch for changes and rebuild');
25
+ console.log(' -s, --site Set the path where site files are located');
26
+ console.log(' -o, --outputPath Set the output directory. Default is ./site/dist');
27
+ console.log(' -t, --templatePath Set the custom template to use');
28
+ console.log();
29
+ console.log(' Arguments serve:');
30
+ console.log(' -p, --port Set the port number used with serve');
31
+ console.log(' -w, --watch watch for changes and rebuild');
32
+ console.log(' -s, --site Set the path where site files are located');
33
+ }
34
+ parseProcessArgv(argv) {
35
+ const command = this.getCommand(argv);
36
+ const args = this.getArguments(argv);
37
+ return {
38
+ argv,
39
+ command,
40
+ args,
41
+ };
42
+ }
43
+ getCommand(argv) {
44
+ let result;
45
+ for (const arg of argv) {
46
+ // eslint-disable-next-line default-case
47
+ switch (arg) {
48
+ case 'init': {
49
+ result = 'init';
50
+ break;
51
+ }
52
+ case 'build': {
53
+ result = 'build';
54
+ break;
55
+ }
56
+ case 'serve': {
57
+ result = 'serve';
58
+ break;
59
+ }
60
+ case 'help': {
61
+ result = 'help';
62
+ break;
63
+ }
64
+ case 'version': {
65
+ result = arg;
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ getArguments(argv) {
73
+ const args = {
74
+ sitePath: '',
75
+ templatePath: '',
76
+ output: '',
77
+ watch: false,
78
+ port: 3000,
79
+ };
80
+ for (let i = 0; i < argv.length; i++) {
81
+ const arg = argv[i];
82
+ // eslint-disable-next-line default-case
83
+ switch (arg) {
84
+ case '-p':
85
+ case '--port': {
86
+ const portString = argv[i + 1];
87
+ if (portString !== undefined) {
88
+ args.port = Number.parseInt(portString, 10);
89
+ }
90
+ break;
91
+ }
92
+ case '-o':
93
+ case '--output': {
94
+ args.output = argv[i + 1];
95
+ args.output = path.join(process.cwd(), args.output);
96
+ break;
97
+ }
98
+ case '-w':
99
+ case '--watch': {
100
+ args.watch = true;
101
+ break;
102
+ }
103
+ case '-s':
104
+ case '--site': {
105
+ args.sitePath = argv[i + 1];
106
+ args.sitePath = path.join(process.cwd(), args.sitePath);
107
+ break;
108
+ }
109
+ case '-t':
110
+ case '--templatePath': {
111
+ args.templatePath = argv[i + 1];
112
+ args.templatePath = path.join(process.cwd(), args.templatePath);
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ return args;
118
+ }
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFbkMsTUFBTSxPQUFPLFlBQVk7SUFDeEIsR0FBRyxDQUFDLE9BQWU7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQWU7UUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWU7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsU0FBUztRQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLHFIQUFxSCxDQUFDLENBQUM7UUFDbkksT0FBTyxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUN6RSxPQUFPLENBQUMsR0FBRyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7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QU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3BELE1BQU07Z0JBQ1AsQ0FBQztnQkFFRCxLQUFLLElBQUksQ0FBQztnQkFDVixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUNsQixNQUFNO2dCQUNQLENBQUM7Z0JBRUQsS0FBSyxJQUFJLENBQUM7Z0JBQ1YsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3hELE1BQU07Z0JBQ1AsQ0FBQztnQkFFRCxLQUFLLElBQUksQ0FBQztnQkFDVixLQUFLLGdCQUFnQixDQUFDLENBQUMsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDaEUsTUFBTTtnQkFDUCxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5leHBvcnQgY2xhc3MgV3JpdHJDb25zb2xlIHtcblx0bG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXHR9XG5cblx0ZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc29sZS5lcnJvcihtZXNzYWdlKTtcblx0fVxuXG5cdHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc29sZS53YXJuKG1lc3NhZ2UpO1xuXHR9XG5cblx0cHJpbnRIZWxwKCk6IHZvaWQge1xuXHRcdGNvbnNvbGUubG9nKCcgICBVc2FnZTogd3JpdHIgW2NvbW1hbmRdIFthcmd1bWVudHNdJyk7XG5cdFx0Y29uc29sZS5sb2coKTtcblx0XHRjb25zb2xlLmxvZygnICAgQ29tbWFuZHM6Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICAgaW5pdCAgICAgICAgICAgSW5pdGlhbGl6ZSBhIG5ldyBwcm9qZWN0Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICAgYnVpbGQgICAgICAgICAgQnVpbGQgdGhlIHByb2plY3QuIEJ5IGRlZmF1bHQganVzdCBucHggd3JpdHIgd2lsbCBidWlsZCB0aGUgcHJvamVjdCBpZiBpdCBmaW5kcyBhIC4vc2l0ZSBmb2xkZXInKTtcblx0XHRjb25zb2xlLmxvZygnICAgICBzZXJ2ZSAgICAgICAgICBTZXJ2ZSB0aGUgcHJvamVjdCBhcyBhIGxvY2FsIHdlYnNpdGUnKTtcblx0XHRjb25zb2xlLmxvZygnICAgICBoZWxwICAgICAgICAgICBQcmludCB0aGlzIGhlbHAnKTtcblx0XHRjb25zb2xlLmxvZygnICAgICB2ZXJzaW9uICAgICAgICBQcmludCB0aGUgdmVyc2lvbicpO1xuXHRcdGNvbnNvbGUubG9nKCk7XG5cdFx0Y29uc29sZS5sb2coJyAgIEFyZ3VtZW50cyBCdWlsZDonKTtcblx0XHRjb25zb2xlLmxvZygnICAgICAtdywgLS13YXRjaCAgICAgICAgICAgIHdhdGNoIGZvciBjaGFuZ2VzIGFuZCByZWJ1aWxkJyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICAgLXMsIC0tc2l0ZSAgICAgICAgICAgICBTZXQgdGhlIHBhdGggd2hlcmUgc2l0ZSBmaWxlcyBhcmUgbG9jYXRlZCcpO1xuXHRcdGNvbnNvbGUubG9nKCcgICAgIC1vLCAtLW91dHB1dFBhdGggICAgICAgU2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBEZWZhdWx0IGlzIC4vc2l0ZS9kaXN0Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICAgLXQsIC0tdGVtcGxhdGVQYXRoICAgICBTZXQgdGhlIGN1c3RvbSB0ZW1wbGF0ZSB0byB1c2UnKTtcblx0XHRjb25zb2xlLmxvZygpO1xuXHRcdGNvbnNvbGUubG9nKCcgICBBcmd1bWVudHMgc2VydmU6Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICAgLXAsIC0tcG9ydCAgICAgICAgIFNldCB0aGUgcG9ydCBudW1iZXIgdXNlZCB3aXRoIHNlcnZlJyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICAgLXcsIC0td2F0Y2ggICAgICAgIHdhdGNoIGZvciBjaGFuZ2VzIGFuZCByZWJ1aWxkJyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICAgLXMsIC0tc2l0ZSAgICAgICAgIFNldCB0aGUgcGF0aCB3aGVyZSBzaXRlIGZpbGVzIGFyZSBsb2NhdGVkJyk7XG5cdH1cblxuXHRwdWJsaWMgcGFyc2VQcm9jZXNzQXJndihhcmd2OiBzdHJpbmdbXSk6IFdyaXRyQ29uc29sZVByb2Nlc3Mge1xuXHRcdGNvbnN0IGNvbW1hbmQgPSB0aGlzLmdldENvbW1hbmQoYXJndik7XG5cdFx0Y29uc3QgYXJncyA9IHRoaXMuZ2V0QXJndW1lbnRzKGFyZ3YpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRhcmd2LFxuXHRcdFx0Y29tbWFuZCxcblx0XHRcdGFyZ3MsXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb21tYW5kKGFyZ3Y6IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgcmVzdWx0O1xuXHRcdGZvciAoY29uc3QgYXJnIG9mIGFyZ3YpIHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2Vcblx0XHRcdHN3aXRjaCAoYXJnKSB7XG5cdFx0XHRcdGNhc2UgJ2luaXQnOiB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gJ2luaXQnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FzZSAnYnVpbGQnOiB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gJ2J1aWxkJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhc2UgJ3NlcnZlJzoge1xuXHRcdFx0XHRcdHJlc3VsdCA9ICdzZXJ2ZSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYXNlICdoZWxwJzoge1xuXHRcdFx0XHRcdHJlc3VsdCA9ICdoZWxwJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhc2UgJ3ZlcnNpb24nOiB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gYXJnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBnZXRBcmd1bWVudHMoYXJndjogc3RyaW5nW10pOiBXcml0ckNvbnNvbGVBcmd1bWVudHMge1xuXHRcdGNvbnN0IGFyZ3MgPSB7XG5cdFx0XHRzaXRlUGF0aDogJycsXG5cdFx0XHR0ZW1wbGF0ZVBhdGg6ICcnLFxuXHRcdFx0b3V0cHV0OiAnJyxcblx0XHRcdHdhdGNoOiBmYWxzZSxcblx0XHRcdHBvcnQ6IDMwMDAsXG5cdFx0fTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXG5cdFx0XHRzd2l0Y2ggKGFyZykge1xuXHRcdFx0XHRjYXNlICctcCc6XG5cdFx0XHRcdGNhc2UgJy0tcG9ydCc6IHtcblx0XHRcdFx0XHRjb25zdCBwb3J0U3RyaW5nID0gYXJndltpICsgMV07XG5cdFx0XHRcdFx0aWYgKHBvcnRTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0YXJncy5wb3J0ID0gTnVtYmVyLnBhcnNlSW50KHBvcnRTdHJpbmcsIDEwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhc2UgJy1vJzpcblx0XHRcdFx0Y2FzZSAnLS1vdXRwdXQnOiB7XG5cdFx0XHRcdFx0YXJncy5vdXRwdXQgPSBhcmd2W2kgKyAxXTtcblx0XHRcdFx0XHRhcmdzLm91dHB1dCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBhcmdzLm91dHB1dCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYXNlICctdyc6XG5cdFx0XHRcdGNhc2UgJy0td2F0Y2gnOiB7XG5cdFx0XHRcdFx0YXJncy53YXRjaCA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYXNlICctcyc6XG5cdFx0XHRcdGNhc2UgJy0tc2l0ZSc6IHtcblx0XHRcdFx0XHRhcmdzLnNpdGVQYXRoID0gYXJndltpICsgMV07XG5cdFx0XHRcdFx0YXJncy5zaXRlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBhcmdzLnNpdGVQYXRoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhc2UgJy10Jzpcblx0XHRcdFx0Y2FzZSAnLS10ZW1wbGF0ZVBhdGgnOiB7XG5cdFx0XHRcdFx0YXJncy50ZW1wbGF0ZVBhdGggPSBhcmd2W2kgKyAxXTtcblx0XHRcdFx0XHRhcmdzLnRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBhcmdzLnRlbXBsYXRlUGF0aCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJncztcblx0fVxufVxuXG50eXBlIFdyaXRyQ29uc29sZVByb2Nlc3MgPSB7XG5cdGFyZ3Y6IHN0cmluZ1tdO1xuXHRjb21tYW5kOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGFyZ3M6IFdyaXRyQ29uc29sZUFyZ3VtZW50cztcbn07XG5cbnR5cGUgV3JpdHJDb25zb2xlQXJndW1lbnRzID0ge1xuXHRzaXRlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR0ZW1wbGF0ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0b3V0cHV0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHdhdGNoOiBib29sZWFuO1xuXHRwb3J0OiBudW1iZXI7XG59O1xuXG4iXX0=
@@ -0,0 +1,22 @@
1
+ export type GithubOptions = {
2
+ api?: string | undefined;
3
+ author: string;
4
+ repo: string;
5
+ };
6
+ export type GithubData = {
7
+ releases: Record<string, unknown>;
8
+ contributors: Record<string, unknown>;
9
+ };
10
+ export declare class Github {
11
+ options: {
12
+ api: string;
13
+ author: string;
14
+ repo: string;
15
+ };
16
+ constructor(options: GithubOptions);
17
+ getData(): Promise<GithubData>;
18
+ getReleases(): Promise<any>;
19
+ getContributors(): Promise<any>;
20
+ parseOptions(options: GithubOptions): void;
21
+ private addAnchorLink;
22
+ }
package/dist/github.js ADDED
@@ -0,0 +1,74 @@
1
+ import axios from 'axios';
2
+ export class Github {
3
+ options = {
4
+ api: 'https://api.github.com',
5
+ author: '',
6
+ repo: '',
7
+ };
8
+ constructor(options) {
9
+ this.parseOptions(options);
10
+ }
11
+ async getData() {
12
+ const data = {
13
+ releases: {},
14
+ contributors: {},
15
+ };
16
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
17
+ data.releases = await this.getReleases();
18
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
19
+ data.contributors = await this.getContributors();
20
+ return data;
21
+ }
22
+ async getReleases() {
23
+ const url = `${this.options.api}/repos/${this.options.author}/${this.options.repo}/releases`;
24
+ try {
25
+ const result = await axios.get(url);
26
+ if (result && result.data.length > 0) {
27
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
28
+ return this.addAnchorLink(result.data);
29
+ }
30
+ return [];
31
+ }
32
+ catch (error) {
33
+ const typedError = error;
34
+ if (typedError.response?.status === 404) {
35
+ throw new Error(`Repository ${this.options.author}/${this.options.repo} not found.`);
36
+ }
37
+ throw error;
38
+ }
39
+ }
40
+ async getContributors() {
41
+ const url = `${this.options.api}/repos/${this.options.author}/${this.options.repo}/contributors`;
42
+ try {
43
+ const result = await axios.get(url);
44
+ if (result && result.data.length > 0) {
45
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
46
+ return result.data;
47
+ }
48
+ }
49
+ catch (error) {
50
+ const typedError = error;
51
+ if (typedError.response?.status === 404) {
52
+ throw new Error(`Repository ${this.options.author}/${this.options.repo} not found.`);
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+ parseOptions(options) {
58
+ if (options.api) {
59
+ this.options.api = options.api;
60
+ }
61
+ this.options.author = options.author;
62
+ this.options.repo = options.repo;
63
+ }
64
+ addAnchorLink(data) {
65
+ return data.map(release => {
66
+ const regex = /(?<!]\()(https:\/\/[\w./]+)(?!\))/g;
67
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
68
+ release.body = release.body.replaceAll(regex, '[$1]($1)');
69
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
70
+ return release;
71
+ });
72
+ }
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dpdGh1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFhMUIsTUFBTSxPQUFPLE1BQU07SUFDbEIsT0FBTyxHQUFHO1FBQ1QsR0FBRyxFQUFFLHdCQUF3QjtRQUM3QixNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxFQUFFO0tBQ1IsQ0FBQztJQUVGLFlBQVksT0FBc0I7UUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDWixNQUFNLElBQUksR0FBRztZQUNaLFFBQVEsRUFBRSxFQUFFO1lBQ1osWUFBWSxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUNGLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pDLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRWpELE9BQU8sSUFBa0IsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDaEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksV0FBVyxDQUFDO1FBQzdGLElBQUksQ0FBQztZQUNKLE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVwQyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsK0RBQStEO2dCQUMvRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQWEsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLEtBQXFDLENBQUM7WUFDekQsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQztZQUN0RixDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUM7UUFDYixDQUFDO0lBQ0YsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLGVBQWUsQ0FBQztRQUNqRyxJQUFJLENBQUM7WUFDSixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLCtEQUErRDtnQkFDL0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3BCLENBQUM7UUFDRixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN6QixNQUFNLFVBQVUsR0FBRyxLQUFxQyxDQUFDO1lBQ3pELElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUVELE1BQU0sS0FBSyxDQUFDO1FBQ2IsQ0FBQztJQUNGLENBQUM7SUFFTSxZQUFZLENBQUMsT0FBc0I7UUFDekMsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBVztRQUNoQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsTUFBTSxLQUFLLEdBQUcsb0NBQW9DLENBQUM7WUFDbkQsc0dBQXNHO1lBQ3RHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzFELCtEQUErRDtZQUMvRCxPQUFPLE9BQU8sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbmV4cG9ydCB0eXBlIEdpdGh1Yk9wdGlvbnMgPSB7XG5cdGFwaT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0YXV0aG9yOiBzdHJpbmc7XG5cdHJlcG86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEdpdGh1YkRhdGEgPSB7XG5cdHJlbGVhc2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0Y29udHJpYnV0b3JzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBHaXRodWIge1xuXHRvcHRpb25zID0ge1xuXHRcdGFwaTogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nLFxuXHRcdGF1dGhvcjogJycsXG5cdFx0cmVwbzogJycsXG5cdH07XG5cblx0Y29uc3RydWN0b3Iob3B0aW9uczogR2l0aHViT3B0aW9ucykge1xuXHRcdHRoaXMucGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuXHR9XG5cblx0YXN5bmMgZ2V0RGF0YSgpOiBQcm9taXNlPEdpdGh1YkRhdGE+IHtcblx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0cmVsZWFzZXM6IHt9LFxuXHRcdFx0Y29udHJpYnV0b3JzOiB7fSxcblx0XHR9O1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblx0XHRkYXRhLnJlbGVhc2VzID0gYXdhaXQgdGhpcy5nZXRSZWxlYXNlcygpO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblx0XHRkYXRhLmNvbnRyaWJ1dG9ycyA9IGF3YWl0IHRoaXMuZ2V0Q29udHJpYnV0b3JzKCk7XG5cblx0XHRyZXR1cm4gZGF0YSBhcyBHaXRodWJEYXRhO1xuXHR9XG5cblx0YXN5bmMgZ2V0UmVsZWFzZXMoKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB1cmwgPSBgJHt0aGlzLm9wdGlvbnMuYXBpfS9yZXBvcy8ke3RoaXMub3B0aW9ucy5hdXRob3J9LyR7dGhpcy5vcHRpb25zLnJlcG99L3JlbGVhc2VzYDtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgYXhpb3MuZ2V0KHVybCk7XG5cblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0LmRhdGEubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cblx0XHRcdFx0cmV0dXJuIHRoaXMuYWRkQW5jaG9yTGluayhyZXN1bHQuZGF0YSBhcyBhbnlbXSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBbXTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Y29uc3QgdHlwZWRFcnJvciA9IGVycm9yIGFzIHtyZXNwb25zZToge3N0YXR1czogbnVtYmVyfX07XG5cdFx0XHRpZiAodHlwZWRFcnJvci5yZXNwb25zZT8uc3RhdHVzID09PSA0MDQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBSZXBvc2l0b3J5ICR7dGhpcy5vcHRpb25zLmF1dGhvcn0vJHt0aGlzLm9wdGlvbnMucmVwb30gbm90IGZvdW5kLmApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRDb250cmlidXRvcnMoKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB1cmwgPSBgJHt0aGlzLm9wdGlvbnMuYXBpfS9yZXBvcy8ke3RoaXMub3B0aW9ucy5hdXRob3J9LyR7dGhpcy5vcHRpb25zLnJlcG99L2NvbnRyaWJ1dG9yc2A7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zLmdldCh1cmwpO1xuXHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQuZGF0YS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0LmRhdGE7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdGNvbnN0IHR5cGVkRXJyb3IgPSBlcnJvciBhcyB7cmVzcG9uc2U6IHtzdGF0dXM6IG51bWJlcn19O1xuXHRcdFx0aWYgKHR5cGVkRXJyb3IucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDA0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgUmVwb3NpdG9yeSAke3RoaXMub3B0aW9ucy5hdXRob3J9LyR7dGhpcy5vcHRpb25zLnJlcG99IG5vdCBmb3VuZC5gKTtcblx0XHRcdH1cblxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHBhcnNlT3B0aW9ucyhvcHRpb25zOiBHaXRodWJPcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbnMuYXBpKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuYXBpID0gb3B0aW9ucy5hcGk7XG5cdFx0fVxuXG5cdFx0dGhpcy5vcHRpb25zLmF1dGhvciA9IG9wdGlvbnMuYXV0aG9yO1xuXHRcdHRoaXMub3B0aW9ucy5yZXBvID0gb3B0aW9ucy5yZXBvO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRBbmNob3JMaW5rKGRhdGE6IGFueVtdKTogYW55W10ge1xuXHRcdHJldHVybiBkYXRhLm1hcChyZWxlYXNlID0+IHtcblx0XHRcdGNvbnN0IHJlZ2V4ID0gLyg/PCFdXFwoKShodHRwczpcXC9cXC9bXFx3Li9dKykoPyFcXCkpL2c7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGxcblx0XHRcdHJlbGVhc2UuYm9keSA9IHJlbGVhc2UuYm9keS5yZXBsYWNlQWxsKHJlZ2V4LCAnWyQxXSgkMSknKTtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblxuXHRcdFx0cmV0dXJuIHJlbGVhc2U7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ export declare const MarkdownHelper: {
2
+ fence(): {
3
+ attributes: {
4
+ language: {
5
+ type: StringConstructor;
6
+ };
7
+ };
8
+ transform(node: any, config: any): import("@markdoc/markdoc").Tag<"pre", {}>;
9
+ };
10
+ };
@@ -0,0 +1,24 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call */
2
+ import pkg from '@markdoc/markdoc';
3
+ // eslint-disable-next-line @typescript-eslint/naming-convention
4
+ const { Tag } = pkg;
5
+ // eslint-disable-next-line @typescript-eslint/naming-convention
6
+ export const MarkdownHelper = {
7
+ fence() {
8
+ return {
9
+ attributes: {
10
+ language: { type: String },
11
+ },
12
+ transform(node, config) {
13
+ const attributes = node.transformAttributes(config);
14
+ const processedChildren = node.transformChildren(config);
15
+ const languageClass = attributes.language ? `language-${attributes.language}` : '';
16
+ const codeAttributes = languageClass ? { class: languageClass } : {};
17
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
18
+ const codeTag = new Tag('code', codeAttributes, processedChildren.join(''));
19
+ return new Tag('pre', {}, [codeTag]);
20
+ },
21
+ };
22
+ },
23
+ };
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9tYXJrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrRkFBK0Y7QUFDL0YsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7QUFFbkMsZ0VBQWdFO0FBQ2hFLE1BQU0sRUFBQyxHQUFHLEVBQUMsR0FBRyxHQUFHLENBQUM7QUFFbEIsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM3QixLQUFLO1FBQ0osT0FBTztZQUNOLFVBQVUsRUFBRTtnQkFDWCxRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDO2FBQ3hCO1lBQ0QsU0FBUyxDQUFDLElBQVMsRUFBRSxNQUFXO2dCQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXBELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRixNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBRW5FLGlFQUFpRTtnQkFDakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFNUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1NBQ0QsQ0FBQztJQUNILENBQUM7Q0FDRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwgKi9cbmltcG9ydCBwa2cgZnJvbSAnQG1hcmtkb2MvbWFya2RvYyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmNvbnN0IHtUYWd9ID0gcGtnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY29uc3QgTWFya2Rvd25IZWxwZXIgPSB7XG5cdGZlbmNlKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRhdHRyaWJ1dGVzOiB7XG5cdFx0XHRcdGxhbmd1YWdlOiB7dHlwZTogU3RyaW5nfSxcblx0XHRcdH0sXG5cdFx0XHR0cmFuc2Zvcm0obm9kZTogYW55LCBjb25maWc6IGFueSkge1xuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVzID0gbm9kZS50cmFuc2Zvcm1BdHRyaWJ1dGVzKGNvbmZpZyk7XG5cblx0XHRcdFx0Y29uc3QgcHJvY2Vzc2VkQ2hpbGRyZW4gPSBub2RlLnRyYW5zZm9ybUNoaWxkcmVuKGNvbmZpZyk7XG5cdFx0XHRcdGNvbnN0IGxhbmd1YWdlQ2xhc3MgPSBhdHRyaWJ1dGVzLmxhbmd1YWdlID8gYGxhbmd1YWdlLSR7YXR0cmlidXRlcy5sYW5ndWFnZX1gIDogJyc7XG5cdFx0XHRcdGNvbnN0IGNvZGVBdHRyaWJ1dGVzID0gbGFuZ3VhZ2VDbGFzcyA/IHtjbGFzczogbGFuZ3VhZ2VDbGFzc30gOiB7fTtcblxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuXHRcdFx0XHRjb25zdCBjb2RlVGFnID0gbmV3IFRhZygnY29kZScsIGNvZGVBdHRyaWJ1dGVzLCBwcm9jZXNzZWRDaGlsZHJlbi5qb2luKCcnKSk7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBUYWcoJ3ByZScsIHt9LCBbY29kZVRhZ10pO1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9LFxufTtcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export declare class WritrHelpers {
2
+ createDoc(path: string, destination: string, frontMatter?: Record<string, string>, contentFn?: (content: string) => string): void;
3
+ getFrontMatterFromFile(path: string): Record<string, string>;
4
+ getFrontMatter(content: string): Record<string, string>;
5
+ setFrontMatterToFile(path: string, frontMatter: Record<string, string>): void;
6
+ setFrontMatterInContent(content: string, frontMatter?: Record<string, string>): string;
7
+ }
@@ -0,0 +1,58 @@
1
+ import fs from 'fs-extra';
2
+ import yaml from 'js-yaml';
3
+ export class WritrHelpers {
4
+ createDoc(path, destination, frontMatter, contentFn) {
5
+ const content = fs.readFileSync(path, 'utf8');
6
+ let newContent = this.setFrontMatterInContent(content, frontMatter);
7
+ if (contentFn) {
8
+ newContent = contentFn(newContent);
9
+ }
10
+ fs.writeFileSync(destination, newContent, 'utf8');
11
+ }
12
+ getFrontMatterFromFile(path) {
13
+ const content = fs.readFileSync(path, 'utf8');
14
+ return this.getFrontMatter(content);
15
+ }
16
+ getFrontMatter(content) {
17
+ // Use regular expressions to extract the FrontMatter
18
+ const match = /^---\r?\n([\s\S]+?)\r?\n---/.exec(content);
19
+ if (match) {
20
+ // Parse the YAML string to an object
21
+ const frontMatter = yaml.load(match[1]);
22
+ return frontMatter;
23
+ }
24
+ // Return null or some default value if no FrontMatter is found
25
+ return {};
26
+ }
27
+ setFrontMatterToFile(path, frontMatter) {
28
+ const content = fs.readFileSync(path, 'utf8');
29
+ const newContent = this.setFrontMatterInContent(content, frontMatter);
30
+ fs.writeFileSync(path, newContent, 'utf8');
31
+ }
32
+ setFrontMatterInContent(content, frontMatter) {
33
+ if (!frontMatter) {
34
+ return content;
35
+ }
36
+ const match = /^---\r?\n([\s\S]+?)\r?\n---\r?\n([\s\S]*)/.exec(content);
37
+ if (match) {
38
+ // Parse the existing FrontMatter
39
+ let oldFrontMatter = yaml.load(match[1]);
40
+ // Set or replace values
41
+ oldFrontMatter = {
42
+ ...oldFrontMatter,
43
+ ...frontMatter,
44
+ };
45
+ // Serialize the FrontMatter back to a YAML string
46
+ const newYaml = yaml.dump(oldFrontMatter);
47
+ // Replace the old FrontMatter with the new string
48
+ const newContent = `---\n${newYaml}---\n${match[2]}`;
49
+ // Write the result back to the file
50
+ return newContent;
51
+ }
52
+ // No FrontMatter found, add it
53
+ const newYaml = yaml.dump(frontMatter);
54
+ const newContent = `---\n${newYaml}---\n${content}`;
55
+ return newContent;
56
+ }
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxQixPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFFM0IsTUFBTSxPQUFPLFlBQVk7SUFDeEIsU0FBUyxDQUFDLElBQVksRUFBRSxXQUFtQixFQUFFLFdBQW9DLEVBQUUsU0FBdUM7UUFDekgsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFOUMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVwRSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2YsVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxJQUFZO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDN0IscURBQXFEO1FBQ3JELE1BQU0sS0FBSyxHQUFHLDZCQUE2QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1gscUNBQXFDO1lBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsT0FBTyxXQUFxQyxDQUFDO1FBQzlDLENBQUM7UUFFRCwrREFBK0Q7UUFDL0QsT0FBTyxFQUFFLENBQUM7SUFDWCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBWSxFQUFFLFdBQW1DO1FBQ3JFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxPQUFlLEVBQUUsV0FBb0M7UUFDNUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sT0FBTyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRywyQ0FBMkMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNYLGlDQUFpQztZQUNqQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXpDLHdCQUF3QjtZQUN4QixjQUFjLEdBQUc7Z0JBQ2hCLEdBQUcsY0FBeUM7Z0JBQzVDLEdBQUcsV0FBVzthQUNkLENBQUM7WUFFRixrREFBa0Q7WUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUUxQyxrREFBa0Q7WUFDbEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxPQUFPLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFckQsb0NBQW9DO1lBQ3BDLE9BQU8sVUFBVSxDQUFDO1FBQ25CLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxRQUFRLE9BQU8sUUFBUSxPQUFPLEVBQUUsQ0FBQztRQUNwRCxPQUFPLFVBQVUsQ0FBQztJQUNuQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmV4cG9ydCBjbGFzcyBXcml0ckhlbHBlcnMge1xuXHRjcmVhdGVEb2MocGF0aDogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nLCBmcm9udE1hdHRlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbnRlbnRGbj86IChjb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKTtcblxuXHRcdGxldCBuZXdDb250ZW50ID0gdGhpcy5zZXRGcm9udE1hdHRlckluQ29udGVudChjb250ZW50LCBmcm9udE1hdHRlcik7XG5cblx0XHRpZiAoY29udGVudEZuKSB7XG5cdFx0XHRuZXdDb250ZW50ID0gY29udGVudEZuKG5ld0NvbnRlbnQpO1xuXHRcdH1cblxuXHRcdGZzLndyaXRlRmlsZVN5bmMoZGVzdGluYXRpb24sIG5ld0NvbnRlbnQsICd1dGY4Jyk7XG5cdH1cblxuXHRnZXRGcm9udE1hdHRlckZyb21GaWxlKHBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRGcm9udE1hdHRlcihjb250ZW50KTtcblx0fVxuXG5cdGdldEZyb250TWF0dGVyKGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuXHRcdC8vIFVzZSByZWd1bGFyIGV4cHJlc3Npb25zIHRvIGV4dHJhY3QgdGhlIEZyb250TWF0dGVyXG5cdFx0Y29uc3QgbWF0Y2ggPSAvXi0tLVxccj9cXG4oW1xcc1xcU10rPylcXHI/XFxuLS0tLy5leGVjKGNvbnRlbnQpO1xuXHRcdGlmIChtYXRjaCkge1xuXHRcdFx0Ly8gUGFyc2UgdGhlIFlBTUwgc3RyaW5nIHRvIGFuIG9iamVjdFxuXHRcdFx0Y29uc3QgZnJvbnRNYXR0ZXIgPSB5YW1sLmxvYWQobWF0Y2hbMV0pO1xuXHRcdFx0cmV0dXJuIGZyb250TWF0dGVyIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIG51bGwgb3Igc29tZSBkZWZhdWx0IHZhbHVlIGlmIG5vIEZyb250TWF0dGVyIGlzIGZvdW5kXG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cblx0c2V0RnJvbnRNYXR0ZXJUb0ZpbGUocGF0aDogc3RyaW5nLCBmcm9udE1hdHRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKTtcblx0XHRjb25zdCBuZXdDb250ZW50ID0gdGhpcy5zZXRGcm9udE1hdHRlckluQ29udGVudChjb250ZW50LCBmcm9udE1hdHRlcik7XG5cdFx0ZnMud3JpdGVGaWxlU3luYyhwYXRoLCBuZXdDb250ZW50LCAndXRmOCcpO1xuXHR9XG5cblx0c2V0RnJvbnRNYXR0ZXJJbkNvbnRlbnQoY29udGVudDogc3RyaW5nLCBmcm9udE1hdHRlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuXHRcdGlmICghZnJvbnRNYXR0ZXIpIHtcblx0XHRcdHJldHVybiBjb250ZW50O1xuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGNoID0gL14tLS1cXHI/XFxuKFtcXHNcXFNdKz8pXFxyP1xcbi0tLVxccj9cXG4oW1xcc1xcU10qKS8uZXhlYyhjb250ZW50KTtcblxuXHRcdGlmIChtYXRjaCkge1xuXHRcdFx0Ly8gUGFyc2UgdGhlIGV4aXN0aW5nIEZyb250TWF0dGVyXG5cdFx0XHRsZXQgb2xkRnJvbnRNYXR0ZXIgPSB5YW1sLmxvYWQobWF0Y2hbMV0pO1xuXG5cdFx0XHQvLyBTZXQgb3IgcmVwbGFjZSB2YWx1ZXNcblx0XHRcdG9sZEZyb250TWF0dGVyID0ge1xuXHRcdFx0XHQuLi5vbGRGcm9udE1hdHRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdFx0Li4uZnJvbnRNYXR0ZXIsXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBTZXJpYWxpemUgdGhlIEZyb250TWF0dGVyIGJhY2sgdG8gYSBZQU1MIHN0cmluZ1xuXHRcdFx0Y29uc3QgbmV3WWFtbCA9IHlhbWwuZHVtcChvbGRGcm9udE1hdHRlcik7XG5cblx0XHRcdC8vIFJlcGxhY2UgdGhlIG9sZCBGcm9udE1hdHRlciB3aXRoIHRoZSBuZXcgc3RyaW5nXG5cdFx0XHRjb25zdCBuZXdDb250ZW50ID0gYC0tLVxcbiR7bmV3WWFtbH0tLS1cXG4ke21hdGNoWzJdfWA7XG5cblx0XHRcdC8vIFdyaXRlIHRoZSByZXN1bHQgYmFjayB0byB0aGUgZmlsZVxuXHRcdFx0cmV0dXJuIG5ld0NvbnRlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gTm8gRnJvbnRNYXR0ZXIgZm91bmQsIGFkZCBpdFxuXHRcdGNvbnN0IG5ld1lhbWwgPSB5YW1sLmR1bXAoZnJvbnRNYXR0ZXIpO1xuXHRcdGNvbnN0IG5ld0NvbnRlbnQgPSBgLS0tXFxuJHtuZXdZYW1sfS0tLVxcbiR7Y29udGVudH1gO1xuXHRcdHJldHVybiBuZXdDb250ZW50O1xuXHR9XG59XG5cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ export declare class WritrOptions {
2
+ templatePath: string;
3
+ outputPath: string;
4
+ sitePath: string;
5
+ githubPath: string;
6
+ siteTitle: string;
7
+ siteDescription: string;
8
+ siteUrl: string;
9
+ port: number;
10
+ constructor(options?: Record<string, unknown>);
11
+ parseOptions(options: Record<string, any>): void;
12
+ }
@@ -0,0 +1,47 @@
1
+ import path from 'node:path';
2
+ import process from 'node:process';
3
+ export class WritrOptions {
4
+ templatePath = './template';
5
+ outputPath = './dist';
6
+ sitePath = './site';
7
+ githubPath = 'jaredwray/writr';
8
+ siteTitle = 'Writr';
9
+ siteDescription = 'Beautiful Website for Your Projects';
10
+ siteUrl = 'https://writr.org';
11
+ port = 3000;
12
+ constructor(options) {
13
+ if (options) {
14
+ this.parseOptions(options);
15
+ }
16
+ }
17
+ parseOptions(options) {
18
+ if (options.templatePath) {
19
+ this.templatePath = options.templatePath;
20
+ this.templatePath = path.join(process.cwd(), this.templatePath);
21
+ }
22
+ if (options.outputPath) {
23
+ this.outputPath = options.outputPath;
24
+ this.githubPath = path.join(process.cwd(), this.outputPath);
25
+ }
26
+ if (options.sitePath) {
27
+ this.sitePath = options.sitePath;
28
+ this.sitePath = path.join(process.cwd(), this.sitePath);
29
+ }
30
+ if (options.githubPath) {
31
+ this.githubPath = options.githubPath;
32
+ }
33
+ if (options.siteTitle) {
34
+ this.siteTitle = options.siteTitle;
35
+ }
36
+ if (options.siteDescription) {
37
+ this.siteDescription = options.siteDescription;
38
+ }
39
+ if (options.siteUrl) {
40
+ this.siteUrl = options.siteUrl;
41
+ }
42
+ if (options.port) {
43
+ this.port = options.port;
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFbkMsTUFBTSxPQUFPLFlBQVk7SUFDakIsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUM1QixVQUFVLEdBQUcsUUFBUSxDQUFDO0lBQ3RCLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDcEIsVUFBVSxHQUFHLGlCQUFpQixDQUFDO0lBQy9CLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDcEIsZUFBZSxHQUFHLHFDQUFxQyxDQUFDO0lBQ3hELE9BQU8sR0FBRyxtQkFBbUIsQ0FBQztJQUM5QixJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRW5CLFlBQVksT0FBaUM7UUFDNUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNGLENBQUM7SUFFTSxZQUFZLENBQUMsT0FBNEI7UUFDL0MsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBc0IsQ0FBQztZQUNuRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBb0IsQ0FBQztZQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBa0IsQ0FBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBb0IsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBbUIsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBeUIsQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBaUIsQ0FBQztRQUMxQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBYyxDQUFDO1FBQ3BDLENBQUM7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuZXhwb3J0IGNsYXNzIFdyaXRyT3B0aW9ucyB7XG5cdHB1YmxpYyB0ZW1wbGF0ZVBhdGggPSAnLi90ZW1wbGF0ZSc7XG5cdHB1YmxpYyBvdXRwdXRQYXRoID0gJy4vZGlzdCc7XG5cdHB1YmxpYyBzaXRlUGF0aCA9ICcuL3NpdGUnO1xuXHRwdWJsaWMgZ2l0aHViUGF0aCA9ICdqYXJlZHdyYXkvd3JpdHInO1xuXHRwdWJsaWMgc2l0ZVRpdGxlID0gJ1dyaXRyJztcblx0cHVibGljIHNpdGVEZXNjcmlwdGlvbiA9ICdCZWF1dGlmdWwgV2Vic2l0ZSBmb3IgWW91ciBQcm9qZWN0cyc7XG5cdHB1YmxpYyBzaXRlVXJsID0gJ2h0dHBzOi8vd3JpdHIub3JnJztcblx0cHVibGljIHBvcnQgPSAzMDAwO1xuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuXHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHR0aGlzLnBhcnNlT3B0aW9ucyhvcHRpb25zKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgcGFyc2VPcHRpb25zKG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0XHRpZiAob3B0aW9ucy50ZW1wbGF0ZVBhdGgpIHtcblx0XHRcdHRoaXMudGVtcGxhdGVQYXRoID0gb3B0aW9ucy50ZW1wbGF0ZVBhdGggYXMgc3RyaW5nO1xuXHRcdFx0dGhpcy50ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgdGhpcy50ZW1wbGF0ZVBhdGgpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLm91dHB1dFBhdGgpIHtcblx0XHRcdHRoaXMub3V0cHV0UGF0aCA9IG9wdGlvbnMub3V0cHV0UGF0aCBhcyBzdHJpbmc7XG5cdFx0XHR0aGlzLmdpdGh1YlBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgdGhpcy5vdXRwdXRQYXRoKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5zaXRlUGF0aCkge1xuXHRcdFx0dGhpcy5zaXRlUGF0aCA9IG9wdGlvbnMuc2l0ZVBhdGggYXMgc3RyaW5nO1xuXHRcdFx0dGhpcy5zaXRlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCB0aGlzLnNpdGVQYXRoKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5naXRodWJQYXRoKSB7XG5cdFx0XHR0aGlzLmdpdGh1YlBhdGggPSBvcHRpb25zLmdpdGh1YlBhdGggYXMgc3RyaW5nO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnNpdGVUaXRsZSkge1xuXHRcdFx0dGhpcy5zaXRlVGl0bGUgPSBvcHRpb25zLnNpdGVUaXRsZSBhcyBzdHJpbmc7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuc2l0ZURlc2NyaXB0aW9uKSB7XG5cdFx0XHR0aGlzLnNpdGVEZXNjcmlwdGlvbiA9IG9wdGlvbnMuc2l0ZURlc2NyaXB0aW9uIGFzIHN0cmluZztcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5zaXRlVXJsKSB7XG5cdFx0XHR0aGlzLnNpdGVVcmwgPSBvcHRpb25zLnNpdGVVcmwgYXMgc3RyaW5nO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnBvcnQpIHtcblx0XHRcdHRoaXMucG9ydCA9IG9wdGlvbnMucG9ydCBhcyBudW1iZXI7XG5cdFx0fVxuXHR9XG59XG4iXX0=
@@ -0,0 +1,23 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import type http from 'node:http';
4
+ import { WritrOptions } from './options.js';
5
+ export default class Writr {
6
+ private _options;
7
+ private readonly _console;
8
+ private _configFileModule;
9
+ private _server;
10
+ constructor(options?: WritrOptions);
11
+ get options(): WritrOptions;
12
+ set options(value: WritrOptions);
13
+ get server(): http.Server | undefined;
14
+ get configFileModule(): any;
15
+ checkForUpdates(): void;
16
+ execute(process: NodeJS.Process): Promise<void>;
17
+ isSinglePageWebsite(sitePath: string): boolean;
18
+ generateInit(sitePath: string): void;
19
+ getVersion(): string;
20
+ loadConfigFile(sitePath: string): Promise<void>;
21
+ serve(options: WritrOptions): Promise<void>;
22
+ }
23
+ export { WritrHelpers } from './helpers.js';
package/dist/writr.js ADDED
@@ -0,0 +1,153 @@
1
+ import path from 'node:path';
2
+ import process from 'node:process';
3
+ import fs from 'fs-extra';
4
+ import updateNotifier from 'update-notifier';
5
+ import express from 'express';
6
+ import { WritrOptions } from './options.js';
7
+ import { WritrConsole } from './console.js';
8
+ import { WritrBuilder } from './builder.js';
9
+ import { MarkdownHelper } from './helpers/markdown.js';
10
+ export default class Writr {
11
+ _options = new WritrOptions();
12
+ _console = new WritrConsole();
13
+ _configFileModule = {};
14
+ _server;
15
+ constructor(options) {
16
+ if (options) {
17
+ this._options = options;
18
+ }
19
+ }
20
+ get options() {
21
+ return this._options;
22
+ }
23
+ set options(value) {
24
+ this._options = value;
25
+ }
26
+ get server() {
27
+ return this._server;
28
+ }
29
+ get configFileModule() {
30
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
31
+ return this._configFileModule;
32
+ }
33
+ checkForUpdates() {
34
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
35
+ if (fs.existsSync(packageJsonPath)) {
36
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
37
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
38
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
39
+ updateNotifier({ pkg: packageJson }).notify();
40
+ }
41
+ }
42
+ async execute(process) {
43
+ // Check for updates
44
+ this.checkForUpdates();
45
+ const consoleProcess = this._console.parseProcessArgv(process.argv);
46
+ // Update options
47
+ if (consoleProcess.args.sitePath) {
48
+ this.options.sitePath = consoleProcess.args.sitePath;
49
+ }
50
+ // Load the Config File
51
+ await this.loadConfigFile(this.options.sitePath);
52
+ // Parse the config file
53
+ if (this._configFileModule.options) {
54
+ this.options.parseOptions(this._configFileModule.options);
55
+ }
56
+ // Run the onPrepare function
57
+ if (this._configFileModule.onPrepare) {
58
+ try {
59
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
60
+ await this._configFileModule.onPrepare(this.options);
61
+ }
62
+ catch (error) {
63
+ this._console.error(error.message);
64
+ }
65
+ }
66
+ if (consoleProcess.args.output) {
67
+ this.options.outputPath = consoleProcess.args.output;
68
+ }
69
+ const engineConfig = {
70
+ nodes: {
71
+ fence: MarkdownHelper.fence(),
72
+ },
73
+ };
74
+ switch (consoleProcess.command) {
75
+ case 'init': {
76
+ const isTypescript = fs.existsSync('./tsconfig.json') ?? false;
77
+ this.generateInit(this.options.sitePath);
78
+ break;
79
+ }
80
+ case 'help': {
81
+ this._console.printHelp();
82
+ break;
83
+ }
84
+ case 'version': {
85
+ this._console.log(this.getVersion());
86
+ break;
87
+ }
88
+ case 'serve': {
89
+ const builder = new WritrBuilder(this.options, engineConfig);
90
+ await builder.build();
91
+ await this.serve(this.options);
92
+ break;
93
+ }
94
+ default: {
95
+ const builder = new WritrBuilder(this.options, engineConfig);
96
+ await builder.build();
97
+ break;
98
+ }
99
+ }
100
+ }
101
+ isSinglePageWebsite(sitePath) {
102
+ const docsPath = `${sitePath}/docs`;
103
+ if (!fs.existsSync(docsPath)) {
104
+ return true;
105
+ }
106
+ const files = fs.readdirSync(docsPath);
107
+ return files.length === 0;
108
+ }
109
+ generateInit(sitePath) {
110
+ // Check if the site path exists
111
+ if (!fs.existsSync(sitePath)) {
112
+ fs.mkdirSync(sitePath);
113
+ }
114
+ // Add the writr.config file based on js or ts
115
+ const writrConfigFile = './init/writr.config.cjs';
116
+ fs.copyFileSync(writrConfigFile, `${sitePath}/writr.config.cjs`);
117
+ // Add in the image and favicon
118
+ fs.copyFileSync('./init/logo.png', `${sitePath}/logo.png`);
119
+ fs.copyFileSync('./init/favicon.svg', `${sitePath}/favicon.svg`);
120
+ // Add in the variables file
121
+ fs.copyFileSync('./init/variables.css', `${sitePath}/variables.css`);
122
+ // Output the instructions
123
+ this._console.log(`Writr initialized. Please update the ${writrConfigFile} file with your site information. In addition, you can replace the image, favicon, and stype the site with site.css file.`);
124
+ }
125
+ getVersion() {
126
+ const packageJson = fs.readFileSync('./package.json', 'utf8');
127
+ const packageObject = JSON.parse(packageJson);
128
+ return packageObject.version;
129
+ }
130
+ async loadConfigFile(sitePath) {
131
+ if (fs.existsSync(sitePath)) {
132
+ const configFile = `${sitePath}/writr.config.cjs`;
133
+ if (fs.existsSync(configFile)) {
134
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
135
+ this._configFileModule = await import(configFile);
136
+ }
137
+ }
138
+ }
139
+ async serve(options) {
140
+ if (this._server) {
141
+ this._server.close();
142
+ }
143
+ const app = express();
144
+ const { port } = options;
145
+ const { outputPath } = options;
146
+ app.use(express.static(outputPath));
147
+ this._server = app.listen(port, () => {
148
+ this._console.log(`Writr listening at http://localhost:${port}`);
149
+ });
150
+ }
151
+ }
152
+ export { WritrHelpers } from './helpers.js';
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUIsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxNQUFNLENBQUMsT0FBTyxPQUFPLEtBQUs7SUFDakIsUUFBUSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ25DLFFBQVEsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNyRCxpQkFBaUIsR0FBUSxFQUFFLENBQUM7SUFDNUIsT0FBTyxDQUEwQjtJQUV6QyxZQUFZLE9BQXNCO1FBQ2pDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN6QixDQUFDO0lBQ0YsQ0FBQztJQUVELElBQVcsT0FBTztRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQW1CO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUMxQiwrREFBK0Q7UUFDL0QsT0FBTyxJ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R0FBRyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxPQUFPLENBQUM7UUFDdkIsTUFBTSxFQUFDLFVBQVUsRUFBQyxHQUFHLE9BQU8sQ0FBQztRQUU3QixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRDtBQUVELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgdXBkYXRlTm90aWZpZXIgZnJvbSAndXBkYXRlLW5vdGlmaWVyJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtXcml0ck9wdGlvbnN9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQge1dyaXRyQ29uc29sZX0gZnJvbSAnLi9jb25zb2xlLmpzJztcbmltcG9ydCB7V3JpdHJCdWlsZGVyfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHtNYXJrZG93bkhlbHBlcn0gZnJvbSAnLi9oZWxwZXJzL21hcmtkb3duLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV3JpdHIge1xuXHRwcml2YXRlIF9vcHRpb25zOiBXcml0ck9wdGlvbnMgPSBuZXcgV3JpdHJPcHRpb25zKCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2NvbnNvbGU6IFdyaXRyQ29uc29sZSA9IG5ldyBXcml0ckNvbnNvbGUoKTtcblx0cHJpdmF0ZSBfY29uZmlnRmlsZU1vZHVsZTogYW55ID0ge307XG5cdHByaXZhdGUgX3NlcnZlcjogaHR0cC5TZXJ2ZXIgfCB1bmRlZmluZWQ7XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86IFdyaXRyT3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0IG9wdGlvbnMoKTogV3JpdHJPcHRpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucztcblx0fVxuXG5cdHB1YmxpYyBzZXQgb3B0aW9ucyh2YWx1ZTogV3JpdHJPcHRpb25zKSB7XG5cdFx0dGhpcy5fb3B0aW9ucyA9IHZhbHVlO1xuXHR9XG5cblx0cHVibGljIGdldCBzZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9zZXJ2ZXI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGNvbmZpZ0ZpbGVNb2R1bGUoKTogYW55IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cblx0XHRyZXR1cm4gdGhpcy5fY29uZmlnRmlsZU1vZHVsZTtcblx0fVxuXG5cdHB1YmxpYyBjaGVja0ZvclVwZGF0ZXMoKTogdm9pZCB7XG5cdFx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdwYWNrYWdlLmpzb24nKTtcblx0XHRpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cdFx0XHRjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cdFx0XHR1cGRhdGVOb3RpZmllcih7cGtnOiBwYWNrYWdlSnNvbn0pLm5vdGlmeSgpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhc3luYyBleGVjdXRlKHByb2Nlc3M6IE5vZGVKUy5Qcm9jZXNzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gQ2hlY2sgZm9yIHVwZGF0ZXNcblx0XHR0aGlzLmNoZWNrRm9yVXBkYXRlcygpO1xuXG5cdFx0Y29uc3QgY29uc29sZVByb2Nlc3MgPSB0aGlzLl9jb25zb2xlLnBhcnNlUHJvY2Vzc0FyZ3YocHJvY2Vzcy5hcmd2KTtcblxuXHRcdC8vIFVwZGF0ZSBvcHRpb25zXG5cdFx0aWYgKGNvbnNvbGVQcm9jZXNzLmFyZ3Muc2l0ZVBhdGgpIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zaXRlUGF0aCA9IGNvbnNvbGVQcm9jZXNzLmFyZ3Muc2l0ZVBhdGg7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCB0aGUgQ29uZmlnIEZpbGVcblx0XHRhd2FpdCB0aGlzLmxvYWRDb25maWdGaWxlKHRoaXMub3B0aW9ucy5zaXRlUGF0aCk7XG5cblx0XHQvLyBQYXJzZSB0aGUgY29uZmlnIGZpbGVcblx0XHRpZiAodGhpcy5fY29uZmlnRmlsZU1vZHVsZS5vcHRpb25zKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMucGFyc2VPcHRpb25zKHRoaXMuX2NvbmZpZ0ZpbGVNb2R1bGUub3B0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcblx0XHR9XG5cblx0XHQvLyBSdW4gdGhlIG9uUHJlcGFyZSBmdW5jdGlvblxuXHRcdGlmICh0aGlzLl9jb25maWdGaWxlTW9kdWxlLm9uUHJlcGFyZSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuXHRcdFx0XHRhd2FpdCB0aGlzLl9jb25maWdGaWxlTW9kdWxlLm9uUHJlcGFyZSh0aGlzLm9wdGlvbnMpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy5fY29uc29sZS5lcnJvcigoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjb25zb2xlUHJvY2Vzcy5hcmdzLm91dHB1dCkge1xuXHRcdFx0dGhpcy5vcHRpb25zLm91dHB1dFBhdGggPSBjb25zb2xlUHJvY2Vzcy5hcmdzLm91dHB1dDtcblx0XHR9XG5cblx0XHRjb25zdCBlbmdpbmVDb25maWcgPSB7XG5cdFx0XHRub2Rlczoge1xuXHRcdFx0XHRmZW5jZTogTWFya2Rvd25IZWxwZXIuZmVuY2UoKSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdHN3aXRjaCAoY29uc29sZVByb2Nlc3MuY29tbWFuZCkge1xuXHRcdFx0Y2FzZSAnaW5pdCc6IHtcblx0XHRcdFx0Y29uc3QgaXNUeXBlc2NyaXB0ID0gZnMuZXhpc3RzU3luYygnLi90c2NvbmZpZy5qc29uJykgPz8gZmFsc2U7XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVJbml0KHRoaXMub3B0aW9ucy5zaXRlUGF0aCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjYXNlICdoZWxwJzoge1xuXHRcdFx0XHR0aGlzLl9jb25zb2xlLnByaW50SGVscCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAndmVyc2lvbic6IHtcblx0XHRcdFx0dGhpcy5fY29uc29sZS5sb2codGhpcy5nZXRWZXJzaW9uKCkpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAnc2VydmUnOiB7XG5cdFx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBuZXcgV3JpdHJCdWlsZGVyKHRoaXMub3B0aW9ucywgZW5naW5lQ29uZmlnKTtcblx0XHRcdFx0YXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnNlcnZlKHRoaXMub3B0aW9ucyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBuZXcgV3JpdHJCdWlsZGVyKHRoaXMub3B0aW9ucywgZW5naW5lQ29uZmlnKTtcblx0XHRcdFx0YXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgaXNTaW5nbGVQYWdlV2Vic2l0ZShzaXRlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZG9jc1BhdGggPSBgJHtzaXRlUGF0aH0vZG9jc2A7XG5cdFx0aWYgKCFmcy5leGlzdHNTeW5jKGRvY3NQYXRoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkb2NzUGF0aCk7XG5cdFx0cmV0dXJuIGZpbGVzLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdHB1YmxpYyBnZW5lcmF0ZUluaXQoc2l0ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRcdC8vIENoZWNrIGlmIHRoZSBzaXRlIHBhdGggZXhpc3RzXG5cdFx0aWYgKCFmcy5leGlzdHNTeW5jKHNpdGVQYXRoKSkge1xuXHRcdFx0ZnMubWtkaXJTeW5jKHNpdGVQYXRoKTtcblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHdyaXRyLmNvbmZpZyBmaWxlIGJhc2VkIG9uIGpzIG9yIHRzXG5cdFx0Y29uc3Qgd3JpdHJDb25maWdGaWxlID0gJy4vaW5pdC93cml0ci5jb25maWcuY2pzJztcblx0XHRmcy5jb3B5RmlsZVN5bmMod3JpdHJDb25maWdGaWxlLCBgJHtzaXRlUGF0aH0vd3JpdHIuY29uZmlnLmNqc2ApO1xuXG5cdFx0Ly8gQWRkIGluIHRoZSBpbWFnZSBhbmQgZmF2aWNvblxuXHRcdGZzLmNvcHlGaWxlU3luYygnLi9pbml0L2xvZ28ucG5nJywgYCR7c2l0ZVBhdGh9L2xvZ28ucG5nYCk7XG5cdFx0ZnMuY29weUZpbGVTeW5jKCcuL2luaXQvZmF2aWNvbi5zdmcnLCBgJHtzaXRlUGF0aH0vZmF2aWNvbi5zdmdgKTtcblxuXHRcdC8vIEFkZCBpbiB0aGUgdmFyaWFibGVzIGZpbGVcblx0XHRmcy5jb3B5RmlsZVN5bmMoJy4vaW5pdC92YXJpYWJsZXMuY3NzJywgYCR7c2l0ZVBhdGh9L3ZhcmlhYmxlcy5jc3NgKTtcblxuXHRcdC8vIE91dHB1dCB0aGUgaW5zdHJ1Y3Rpb25zXG5cdFx0dGhpcy5fY29uc29sZS5sb2coYFdyaXRyIGluaXRpYWxpemVkLiBQbGVhc2UgdXBkYXRlIHRoZSAke3dyaXRyQ29uZmlnRmlsZX0gZmlsZSB3aXRoIHlvdXIgc2l0ZSBpbmZvcm1hdGlvbi4gSW4gYWRkaXRpb24sIHlvdSBjYW4gcmVwbGFjZSB0aGUgaW1hZ2UsIGZhdmljb24sIGFuZCBzdHlwZSB0aGUgc2l0ZSB3aXRoIHNpdGUuY3NzIGZpbGUuYCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHBhY2thZ2VKc29uID0gZnMucmVhZEZpbGVTeW5jKCcuL3BhY2thZ2UuanNvbicsICd1dGY4Jyk7XG5cdFx0Y29uc3QgcGFja2FnZU9iamVjdCA9IEpTT04ucGFyc2UocGFja2FnZUpzb24pIGFzIHt2ZXJzaW9uOiBzdHJpbmd9O1xuXHRcdHJldHVybiBwYWNrYWdlT2JqZWN0LnZlcnNpb247XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgbG9hZENvbmZpZ0ZpbGUoc2l0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChmcy5leGlzdHNTeW5jKHNpdGVQYXRoKSkge1xuXHRcdFx0Y29uc3QgY29uZmlnRmlsZSA9IGAke3NpdGVQYXRofS93cml0ci5jb25maWcuY2pzYDtcblx0XHRcdGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblx0XHRcdFx0dGhpcy5fY29uZmlnRmlsZU1vZHVsZSA9IGF3YWl0IGltcG9ydChjb25maWdGaWxlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgc2VydmUob3B0aW9uczogV3JpdHJPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuX3NlcnZlcikge1xuXHRcdFx0dGhpcy5fc2VydmVyLmNsb3NlKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYXBwID0gZXhwcmVzcygpO1xuXHRcdGNvbnN0IHtwb3J0fSA9IG9wdGlvbnM7XG5cdFx0Y29uc3Qge291dHB1dFBhdGh9ID0gb3B0aW9ucztcblxuXHRcdGFwcC51c2UoZXhwcmVzcy5zdGF0aWMob3V0cHV0UGF0aCkpO1xuXG5cdFx0dGhpcy5fc2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG5cdFx0XHR0aGlzLl9jb25zb2xlLmxvZyhgV3JpdHIgbGlzdGVuaW5nIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApO1xuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCB7V3JpdHJIZWxwZXJzfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuIl19
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 15"><defs><style>.a{fill:#ff690a;}.b{fill:#373232;}</style></defs><title>WRITR favicon</title><path class="a" d="M1.5,12h12v1H1.5Z"/><path class="b" d="M11.6,11H9L7.49,6h0L6,11H3.38L0,2H3.08L4.8,7.25h.06L6.38,2H8.69l1.58,5.25h0L12.05,2H15Z"/></svg>
package/init/logo.png ADDED
Binary file