@abreen/tada 1.0.2 → 1.2.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 (146) hide show
  1. package/README.md +96 -48
  2. package/bin/tada.ts +621 -0
  3. package/bin/validators.test.ts +205 -0
  4. package/bin/validators.ts +85 -0
  5. package/{webpack/apply-base-path-plugin.js → build/apply-base-path-plugin.ts} +37 -17
  6. package/build/build-manifest.test.ts +349 -0
  7. package/build/build-manifest.ts +165 -0
  8. package/build/bundle.ts +116 -0
  9. package/{webpack/code.test.js → build/code.test.ts} +10 -7
  10. package/build/colors.ts +25 -0
  11. package/build/content-watch.ts +107 -0
  12. package/build/copy.ts +118 -0
  13. package/{webpack/deflist-id-plugin.js → build/deflist-id-plugin.ts} +7 -6
  14. package/{webpack/external-links-plugin.js → build/external-links-plugin.ts} +14 -5
  15. package/build/features.ts +11 -0
  16. package/build/generate-content-assets.ts +320 -0
  17. package/build/generate-favicon.ts +172 -0
  18. package/build/generate-fonts.ts +31 -0
  19. package/build/generate-katex-assets.ts +35 -0
  20. package/{webpack/generate-manifest-plugin.js → build/generate-manifest.ts} +29 -36
  21. package/build/globals.test.ts +99 -0
  22. package/build/globals.ts +88 -0
  23. package/{webpack/heading-subtitle-plugin.js → build/heading-subtitle-plugin.ts} +4 -2
  24. package/build/json-schema.test.ts +57 -0
  25. package/build/json-schema.ts +33 -0
  26. package/build/log.test.ts +111 -0
  27. package/build/log.ts +167 -0
  28. package/build/markdown-plugins.test.ts +396 -0
  29. package/{webpack/pagefind-plugin.test.js → build/pagefind.test.ts} +74 -13
  30. package/build/pagefind.ts +339 -0
  31. package/build/pdf-text.test.ts +52 -0
  32. package/{webpack/pdf-text.js → build/pdf-text.ts} +47 -27
  33. package/build/pipeline.ts +120 -0
  34. package/{webpack/reachability.test.js → build/reachability.test.ts} +3 -3
  35. package/{webpack/reachability.js → build/reachability.ts} +77 -34
  36. package/build/serve.ts +112 -0
  37. package/build/site-variables.ts +68 -0
  38. package/{webpack/templates.js → build/templates.ts} +38 -35
  39. package/{webpack/text-to-id.js → build/text-to-id.ts} +2 -2
  40. package/build/toc-plugin.test.ts +105 -0
  41. package/{webpack/toc-plugin.js → build/toc-plugin.ts} +32 -13
  42. package/build/types.ts +181 -0
  43. package/build/util.ts +26 -0
  44. package/{webpack/utils/code.js → build/utils/code.ts} +119 -60
  45. package/{webpack/utils/content-files.js → build/utils/content-files.ts} +40 -35
  46. package/build/utils/derive-theme.test.ts +111 -0
  47. package/build/utils/derive-theme.ts +85 -0
  48. package/build/utils/file-types.test.ts +61 -0
  49. package/build/utils/file-types.ts +13 -0
  50. package/build/utils/front-matter.test.ts +77 -0
  51. package/{webpack/utils/front-matter.js → build/utils/front-matter.ts} +22 -9
  52. package/{webpack → build}/utils/jdi-runner/LiterateRunner.java +1 -1
  53. package/{webpack/utils/literate-java.js → build/utils/literate-java.ts} +68 -38
  54. package/{webpack/utils/markdown.js → build/utils/markdown.ts} +126 -49
  55. package/build/utils/paths.test.ts +91 -0
  56. package/{webpack/utils/paths.js → build/utils/paths.ts} +18 -22
  57. package/{webpack/utils/render.js → build/utils/render.ts} +208 -130
  58. package/build/utils/shiki-highlighter.ts +29 -0
  59. package/build/validate-internal-links-plugin.test.ts +106 -0
  60. package/{webpack/validate-internal-links-plugin.js → build/validate-internal-links-plugin.ts} +47 -20
  61. package/{webpack/watch-reachability-state.test.js → build/watch-reachability-state.test.ts} +8 -8
  62. package/{webpack/watch-reachability-state.js → build/watch-reachability-state.ts} +63 -24
  63. package/{webpack/watch-reload-client.js → build/watch-reload-client.ts} +3 -1
  64. package/build/watch.ts +549 -0
  65. package/fonts/google-sans-code/woff2/GoogleSansCodeVariable-Italic.woff2 +0 -0
  66. package/fonts/google-sans-code/woff2/GoogleSansCodeVariable.woff2 +0 -0
  67. package/fonts/inter/woff2/InterVariable-Italic.woff2 +0 -0
  68. package/fonts/inter/woff2/InterVariable.woff2 +0 -0
  69. package/{content → init/content}/index.md +9 -3
  70. package/{content → init/content}/lectures/index.md +1 -1
  71. package/{content → init/content}/markdown.md +28 -8
  72. package/init/content/problem_sets/index.html +14 -0
  73. package/package.json +33 -22
  74. package/{templates → schema}/nav.schema.json +1 -2
  75. package/{webpack → schema}/site.schema.json +4 -12
  76. package/src/_alerts.scss +96 -0
  77. package/src/_base.scss +145 -0
  78. package/src/{layout.scss → _layout.scss} +36 -1
  79. package/src/anchor/index.ts +0 -1
  80. package/src/anchor/style.scss +1 -9
  81. package/src/code/index.ts +3 -3
  82. package/src/code.scss +1 -1
  83. package/src/critical.scss +5 -0
  84. package/src/header/_base.scss +129 -0
  85. package/src/header/style.scss +3 -131
  86. package/src/index.ts +4 -5
  87. package/src/question/style.scss +1 -1
  88. package/src/search/index.test.ts +203 -0
  89. package/src/search/index.ts +38 -93
  90. package/src/search/pdf-utils.ts +79 -0
  91. package/src/search/style.scss +8 -28
  92. package/src/style.scss +15 -326
  93. package/src/timezone/index.ts +5 -6
  94. package/src/toc/style.scss +5 -39
  95. package/src/util.ts +9 -6
  96. package/templates/_theme.scss +38 -14
  97. package/templates/_top.html +1 -1
  98. package/tsconfig.json +10 -6
  99. package/types/dev.d.ts +1 -0
  100. package/types/file-system-access.d.ts +5 -0
  101. package/types/markdown-it-plugins.d.ts +11 -0
  102. package/types/site-variables.d.ts +6 -10
  103. package/types/untyped-modules.d.ts +47 -0
  104. package/bin/tada.js +0 -361
  105. package/config/authors.json +0 -1
  106. package/config/nav.json +0 -28
  107. package/content/problem_sets/index.md +0 -6
  108. package/types/dev.ts +0 -3
  109. package/webpack/build-state.js +0 -97
  110. package/webpack/colors.js +0 -15
  111. package/webpack/config.base.js +0 -151
  112. package/webpack/config.dev.js +0 -23
  113. package/webpack/config.prod.js +0 -32
  114. package/webpack/content-watch-plugin.js +0 -153
  115. package/webpack/features.js +0 -5
  116. package/webpack/generate-content-assets-plugin.js +0 -308
  117. package/webpack/generate-favicon-plugin.js +0 -198
  118. package/webpack/generate-fonts-plugin.js +0 -69
  119. package/webpack/globals.js +0 -74
  120. package/webpack/json-schema.js +0 -19
  121. package/webpack/log.js +0 -143
  122. package/webpack/markdown-plugins.test.js +0 -203
  123. package/webpack/pagefind-plugin.js +0 -379
  124. package/webpack/print-flair-plugin.js +0 -22
  125. package/webpack/serve.js +0 -104
  126. package/webpack/site-variables.js +0 -53
  127. package/webpack/util.js +0 -49
  128. package/webpack/utils/define-plugin.js +0 -20
  129. package/webpack/utils/file-types.js +0 -26
  130. package/webpack/utils/parse-hsl.js +0 -8
  131. package/webpack/utils/shiki-highlighter.js +0 -26
  132. package/webpack/watch.js +0 -166
  133. /package/{webpack → build}/flair.json +0 -0
  134. /package/{webpack → build}/utils/jdi-runner/LiterateRunner.class +0 -0
  135. /package/fonts/google-sans-code/{GoogleSansCodeVariable-Italic.ttf → ttf/GoogleSansCodeVariable-Italic.ttf} +0 -0
  136. /package/fonts/google-sans-code/{GoogleSansCodeVariable.ttf → ttf/GoogleSansCodeVariable.ttf} +0 -0
  137. /package/fonts/inter/{InterVariable-Italic.ttf → ttf/InterVariable-Italic.ttf} +0 -0
  138. /package/fonts/inter/{InterVariable.ttf → ttf/InterVariable.ttf} +0 -0
  139. /package/{content → init/content}/lectures/01/Pair.java.md +0 -0
  140. /package/{content → init/content}/lectures/01/Rectangle.java +0 -0
  141. /package/{content → init/content}/lectures/01/demo.py +0 -0
  142. /package/{content → init/content}/lectures/01/index.md +0 -0
  143. /package/{content → init/content}/lectures/01/lecture1.pdf +0 -0
  144. /package/{public → init/public}/avatars/alex.jpg +0 -0
  145. /package/{public → init/public}/test.txt +0 -0
  146. /package/{templates → schema}/authors.schema.json +0 -0
package/webpack/watch.js DELETED
@@ -1,166 +0,0 @@
1
- #!/usr/bin/env node
2
- const webpack = require('webpack');
3
- const { fork } = require('child_process');
4
- const path = require('path');
5
- const WebSocket = require('ws');
6
- const { B, G } = require('./colors');
7
- const { makeLogger, getFlair } = require('./log');
8
- const getConfig = require('./config.dev');
9
- const ContentWatchPlugin = require('./content-watch-plugin');
10
- const { getContentDir } = require('./util');
11
-
12
- const WEBSOCKET_PORT = 35729;
13
-
14
- const log = makeLogger(__filename);
15
- const wslog = makeLogger('WebSocket');
16
- const contentDir = getContentDir();
17
-
18
- function broadcast(msg) {
19
- if (wss == null || !webSocketsReady) {
20
- return;
21
- }
22
- wslog.debug(`Broadcasting "${msg}" to WebSocket clients...`);
23
- wss.clients.forEach(client => {
24
- if (client.readyState === WebSocket.OPEN) {
25
- client.send(msg);
26
- }
27
- });
28
- }
29
-
30
- function serve() {
31
- const child = fork(path.join(__dirname, 'serve.js'), { stdio: 'inherit' });
32
- child.on('close', code => {
33
- webServerReady = false;
34
- log.error`Web server exited with code ${code}`;
35
- process.exit(2);
36
- });
37
- child.on('error', err => {
38
- webServerReady = false;
39
- log.error`Web server failed: ${err.message}`;
40
- });
41
- child.on('message', msg => {
42
- if (msg.ready) {
43
- webServerReady = true;
44
- clearTimeout(webServerTimeout);
45
- }
46
- });
47
-
48
- webServerTimeout = setTimeout(() => {
49
- if (webServerReady) {
50
- return;
51
- }
52
- log.error`Web server failed to report within 10 seconds, exiting`;
53
- process.exit(3);
54
- }, 10000);
55
- }
56
-
57
- function toContentMarkdownPath(filePath) {
58
- if (!filePath) {
59
- return null;
60
- }
61
- const ext = path.extname(filePath).toLowerCase();
62
- if (!['.md', '.markdown'].includes(ext)) {
63
- return null;
64
- }
65
-
66
- const normalizedContentDir = path.resolve(contentDir) + path.sep;
67
- const normalizedFilePath = path.resolve(filePath);
68
- if (!normalizedFilePath.startsWith(normalizedContentDir)) {
69
- return null;
70
- }
71
-
72
- return path
73
- .relative(contentDir, normalizedFilePath)
74
- .split(path.sep)
75
- .join(path.posix.sep);
76
- }
77
-
78
- function logChangedMarkdownFiles(files, { skip = new Set() } = {}) {
79
- if (!files) {
80
- return;
81
- }
82
-
83
- const markdownPaths = [...files]
84
- .map(toContentMarkdownPath)
85
- .filter(markdownPath => markdownPath && !skip.has(markdownPath))
86
- .sort();
87
-
88
- for (const markdownPath of markdownPaths) {
89
- log.event`${B`${markdownPath}`} changed, rebuilding...`;
90
- }
91
- }
92
-
93
- let webSocketsReady = false;
94
- let webServerReady = false;
95
- let webServerTimeout;
96
- let serveStarted = false;
97
- let currentWatcher = null;
98
-
99
- let wss = null;
100
- try {
101
- wss = new WebSocket.Server({ port: WEBSOCKET_PORT });
102
-
103
- wss.on('connection', conn => {
104
- wslog.debug`WebSocket client connected`;
105
- conn.on('close', () => {
106
- wslog.debug`WebSocket client disconnected`;
107
- });
108
- });
109
-
110
- wss.on('error', err => {
111
- wslog.error`WebSocket server error: ${err.message}`;
112
- });
113
-
114
- wss.on('listening', () => {
115
- wslog.debug`WebSocket server listening at ws://localhost:${WEBSOCKET_PORT}`;
116
- webSocketsReady = true;
117
- });
118
- } catch (err) {
119
- wslog.error`Failed to start WebSocket server on port ${WEBSOCKET_PORT}: ${err.message}`;
120
- }
121
-
122
- async function startWatching() {
123
- const config = await getConfig({ watchMode: true });
124
- const compiler = webpack(config);
125
- const loggedInvalidationFiles = new Set();
126
-
127
- compiler.hooks.invalid.tap('WatchChangedFileLog', fileName => {
128
- broadcast('rebuilding');
129
-
130
- const markdownPath = toContentMarkdownPath(fileName);
131
- if (markdownPath) {
132
- loggedInvalidationFiles.add(markdownPath);
133
- log.event`${B`${markdownPath}`} changed, rebuilding...`;
134
- }
135
- });
136
-
137
- currentWatcher = compiler.watch({ aggregateTimeout: 300 }, (err, stats) => {
138
- logChangedMarkdownFiles(compiler.modifiedFiles, {
139
- skip: loggedInvalidationFiles,
140
- });
141
- loggedInvalidationFiles.clear();
142
-
143
- if (ContentWatchPlugin.needsRestart()) {
144
- ContentWatchPlugin.clearRestart();
145
- log.event`Content changed, restarting Webpack compiler...`;
146
- currentWatcher.close(() => startWatching());
147
- return;
148
- }
149
-
150
- if (err) {
151
- log.error`Build failed: ${err.message}`;
152
- } else if (stats.hasErrors()) {
153
- process.stderr.write(stats.toString('errors-only') + '\n');
154
- log.error`Build failed`;
155
- } else {
156
- log.event`${getFlair()} Webpack build completed ${G`successfully`}`;
157
- broadcast('reload');
158
- }
159
- if (!serveStarted && !err && !stats.hasErrors()) {
160
- serveStarted = true;
161
- serve();
162
- }
163
- });
164
- }
165
-
166
- startWatching();
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes