@mvarble/mesearch 0.1.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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/app/ambient.d.ts +24 -0
  4. package/app/app.html +28 -0
  5. package/app/components/Proof.svelte +19 -0
  6. package/app/components/Statement.svelte +19 -0
  7. package/app/error.html +23 -0
  8. package/app/hooks.server.ts +8 -0
  9. package/app/lib/format.ts +6 -0
  10. package/app/lib/server/refs.ts +32 -0
  11. package/app/lib/types.ts +16 -0
  12. package/app/params/kind.ts +5 -0
  13. package/app/routes/+error.svelte +37 -0
  14. package/app/routes/+layout.svelte +41 -0
  15. package/app/routes/+layout.ts +2 -0
  16. package/app/routes/+page.server.ts +37 -0
  17. package/app/routes/+page.svelte +212 -0
  18. package/app/routes/+page.ts +18 -0
  19. package/app/routes/[kind=kind]/[slug]/+page.server.ts +62 -0
  20. package/app/routes/[kind=kind]/[slug]/+page.svelte +116 -0
  21. package/app/routes/[kind=kind]/[slug]/+page.ts +8 -0
  22. package/app/routes/search.json/+server.ts +30 -0
  23. package/app/static/favicon.svg +1 -0
  24. package/dist/cli.d.ts +2 -0
  25. package/dist/cli.js +146 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +26 -0
  28. package/dist/config.js +82 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/headings.d.ts +2 -0
  31. package/dist/headings.js +17 -0
  32. package/dist/headings.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/init.d.ts +6 -0
  37. package/dist/init.js +214 -0
  38. package/dist/init.js.map +1 -0
  39. package/dist/kit.d.ts +4 -0
  40. package/dist/kit.js +180 -0
  41. package/dist/kit.js.map +1 -0
  42. package/dist/paths.d.ts +8 -0
  43. package/dist/paths.js +16 -0
  44. package/dist/paths.js.map +1 -0
  45. package/dist/project.d.ts +26 -0
  46. package/dist/project.js +92 -0
  47. package/dist/project.js.map +1 -0
  48. package/dist/resolve.d.ts +2 -0
  49. package/dist/resolve.js +51 -0
  50. package/dist/resolve.js.map +1 -0
  51. package/package.json +83 -0
  52. package/templates/AGENTS.md +64 -0
  53. package/templates/content/concepts/example-concept/description.md +1 -0
  54. package/templates/content/concepts/example-concept/index.md +16 -0
  55. package/templates/content/description.md +1 -0
  56. package/templates/content/writeups/example-writeup/index.md +7 -0
  57. package/templates/mesearch.config.ts +22 -0
  58. package/tsconfig.project.json +16 -0
package/dist/init.js ADDED
@@ -0,0 +1,214 @@
1
+ import fs from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import path from 'node:path';
4
+ import { packageDir, templatesDir } from "./paths.js";
5
+ // Versions of the tools a project lints and formats with, matching this
6
+ // workspace's own.
7
+ const DEV_DEPENDENCIES = {
8
+ '@eslint/js': '^10.0.1',
9
+ eslint: '^10.4.1',
10
+ 'eslint-config-prettier': '^10.1.8',
11
+ 'eslint-plugin-svelte': '^3.23.0',
12
+ globals: '^17.6.0',
13
+ prettier: '^3.9.6',
14
+ 'prettier-plugin-svelte': '^4.1.1',
15
+ typescript: '^6.0.3',
16
+ 'typescript-eslint': '^8.71.0',
17
+ };
18
+ const SCRIPTS = {
19
+ dev: 'mesearch dev',
20
+ build: 'mesearch build',
21
+ lint: 'prettier --check . && eslint .',
22
+ format: 'prettier --write .',
23
+ };
24
+ // `mesearch init`: everything a project needs, written only where nothing is
25
+ // already, so it is safe to run in a project that has some of it.
26
+ export function initProject(dir, options = {}) {
27
+ fs.mkdirSync(dir, { recursive: true });
28
+ const written = [];
29
+ const skipped = [];
30
+ const title = titleFrom(dir);
31
+ const date = new Date().toISOString().slice(0, 10);
32
+ const fill = (text) => text.replaceAll('{{title}}', title).replaceAll('{{date}}', date);
33
+ const write = (name, contents) => {
34
+ const file = path.join(dir, name);
35
+ if (fs.existsSync(file) && !options.force) {
36
+ skipped.push(name);
37
+ return;
38
+ }
39
+ fs.mkdirSync(path.dirname(file), { recursive: true });
40
+ fs.writeFileSync(file, contents);
41
+ written.push(name);
42
+ };
43
+ for (const name of listFiles(templatesDir)) {
44
+ write(name, fill(fs.readFileSync(path.join(templatesDir, name), 'utf8')));
45
+ }
46
+ write('content/sequences/.gitkeep', '');
47
+ write('mesearch.css', userStylesheet());
48
+ write('tsconfig.json', JSON.stringify({ extends: '@mvarble/mesearch/tsconfig.json' }, null, 4) + '\n');
49
+ write('prettier.config.js', PRETTIER);
50
+ write('eslint.config.js', ESLINT);
51
+ write('.prettierignore', 'build/\n.mesearch/\npnpm-lock.yaml\npackage-lock.json\n');
52
+ updatePackageJson(dir, title, written);
53
+ updateGitignore(dir, written);
54
+ for (const name of written)
55
+ console.log(` wrote ${name}`);
56
+ for (const name of skipped)
57
+ console.log(` kept ${name} (exists; --force to overwrite)`);
58
+ console.log(`\nmesearch: ${path.relative(process.cwd(), dir) || '.'} is ready.\n` +
59
+ 'Install the dependencies (`pnpm install`, or npm or yarn), then `pnpm dev` to start writing.');
60
+ }
61
+ // Adds mesearch's scripts and dependencies to the project's manifest, making
62
+ // one if there is none, and never replacing what is already there.
63
+ function updatePackageJson(dir, title, written) {
64
+ const file = path.join(dir, 'package.json');
65
+ const exists = fs.existsSync(file);
66
+ const manifest = exists
67
+ ? JSON.parse(fs.readFileSync(file, 'utf8'))
68
+ : {
69
+ name: slugify(title) || 'mesearch-site',
70
+ private: true,
71
+ };
72
+ const own = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json'), 'utf8'));
73
+ manifest.type ??= 'module';
74
+ const scripts = (manifest.scripts ??= {});
75
+ for (const [name, command] of Object.entries(SCRIPTS))
76
+ scripts[name] ??= command;
77
+ const dependencies = (manifest.dependencies ??= {});
78
+ const devDependencies = (manifest.devDependencies ??= {});
79
+ if (!dependencies['@mvarble/mesearch'] && !devDependencies['@mvarble/mesearch']) {
80
+ dependencies['@mvarble/mesearch'] = `^${own.version}`;
81
+ }
82
+ for (const [name, version] of Object.entries(DEV_DEPENDENCIES)) {
83
+ if (!dependencies[name])
84
+ devDependencies[name] ??= version;
85
+ }
86
+ const contents = JSON.stringify(manifest, null, 4) + '\n';
87
+ if (exists && contents == fs.readFileSync(file, 'utf8'))
88
+ return;
89
+ fs.writeFileSync(file, contents);
90
+ written.push(exists ? 'package.json (scripts and dependencies added)' : 'package.json');
91
+ }
92
+ function updateGitignore(dir, written) {
93
+ const file = path.join(dir, '.gitignore');
94
+ const current = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
95
+ const lines = current.split(/\r?\n/);
96
+ const missing = ['node_modules/', '.mesearch/', 'build/'].filter((entry) => !lines.includes(entry) && !lines.includes(entry.replace(/\/$/, '')));
97
+ if (!missing.length)
98
+ return;
99
+ const prefix = current && !current.endsWith('\n') ? '\n' : '';
100
+ fs.writeFileSync(file, current + prefix + missing.join('\n') + '\n');
101
+ written.push(current ? '.gitignore (entries added)' : '.gitignore');
102
+ }
103
+ // The UI library's stylesheet of variables.
104
+ export function tokensFile() {
105
+ const ui = createRequire(import.meta.url).resolve('@mvarble/mesearch-ui/package.json');
106
+ return path.join(path.dirname(ui), 'dist', 'styles', 'tokens.css');
107
+ }
108
+ // `mesearch.css`: every variable the site is styled with, commented out, so
109
+ // that overriding one is a matter of uncommenting it. Generated from the
110
+ // stylesheet the site actually uses, so the list cannot fall out of date.
111
+ export function userStylesheet() {
112
+ const tokens = fs.readFileSync(tokensFile(), 'utf8');
113
+ const body = tokens
114
+ // The file's own preamble is replaced by the one below.
115
+ .replace(/^\/\*[\s\S]*?\*\/\s*/, '')
116
+ // Every declaration, however many lines its value runs to.
117
+ .replace(/^(\s*)(--[\w-]+\s*:[^;]*;)/gm, (_, indent, declaration) => declaration
118
+ .split('\n')
119
+ .map((line, i) => i == 0 ? `${indent}/* ${line}` : `${indent} ${line.trim()}`)
120
+ .join('\n') + ' */')
121
+ .replace(/^(\s*)(color-scheme\s*:[^;]*;)/gm, '$1/* $2 */');
122
+ return `/* mesearch.css: this site's own styles, loaded after mesearch's.
123
+ *
124
+ * Every variable mesearch styles the site with is listed below, commented out
125
+ * and set to its default. Uncomment one to change it: the first block is the
126
+ * light theme, the second the dark. Anything else written here applies too,
127
+ * so this is also where to restyle a particular element.
128
+ *
129
+ * To use a different typeface, load it here and point a font variable at it:
130
+ *
131
+ * @import url('https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400..800;1,400..800&display=swap');
132
+ *
133
+ * :root {
134
+ * --font-serif: 'EB Garamond', Georgia, serif;
135
+ * }
136
+ *
137
+ * An \`@import\` has to come before every other rule in the file. A font
138
+ * installed with npm (\`pnpm add @fontsource/eb-garamond\`) can be imported
139
+ * the same way: \`@import '@fontsource/eb-garamond';\`.
140
+ */
141
+
142
+ ${body.trimEnd()}
143
+ `;
144
+ }
145
+ function listFiles(dir, prefix = '') {
146
+ return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
147
+ const name = prefix ? `${prefix}/${entry.name}` : entry.name;
148
+ return entry.isDirectory() ? listFiles(path.join(dir, entry.name), name) : [name];
149
+ });
150
+ }
151
+ // A title from the directory's name: `probability-notes` → `Probability notes`.
152
+ function titleFrom(dir) {
153
+ const words = path.basename(path.resolve(dir)).replace(/[-_]+/g, ' ').trim();
154
+ return words ? words[0].toUpperCase() + words.slice(1) : 'Notes';
155
+ }
156
+ const slugify = (text) => text
157
+ .toLowerCase()
158
+ .replace(/[^a-z0-9]+/g, '-')
159
+ .replace(/^-+|-+$/g, '');
160
+ const PRETTIER = `/** @type {import("prettier").Config} */
161
+ const config = {
162
+ useTabs: false,
163
+ singleQuote: true,
164
+ trailingComma: 'all',
165
+ tabWidth: 4,
166
+ printWidth: 100,
167
+ plugins: ['prettier-plugin-svelte'],
168
+ overrides: [{ files: '*.svelte', options: { parser: 'svelte' } }],
169
+ };
170
+
171
+ export default config;
172
+ `;
173
+ const ESLINT = `import prettier from 'eslint-config-prettier';
174
+ import path from 'node:path';
175
+ import js from '@eslint/js';
176
+ import svelte from 'eslint-plugin-svelte';
177
+ import globals from 'globals';
178
+ import ts from 'typescript-eslint';
179
+ import { defineConfig, includeIgnoreFile } from 'eslint/config';
180
+
181
+ const gitignorePath = path.resolve(import.meta.dirname, '.gitignore');
182
+
183
+ export default defineConfig(
184
+ includeIgnoreFile(gitignorePath),
185
+ js.configs.recommended,
186
+ ts.configs.recommended,
187
+ svelte.configs.recommended,
188
+ prettier,
189
+ svelte.configs.prettier,
190
+ {
191
+ languageOptions: {
192
+ globals: { ...globals.browser, ...globals.node },
193
+ },
194
+ rules: {
195
+ 'no-undef': 'off',
196
+ },
197
+ },
198
+ {
199
+ files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
200
+ languageOptions: {
201
+ parserOptions: {
202
+ extraFileExtensions: ['.svelte'],
203
+ parser: ts.parser,
204
+ },
205
+ },
206
+ },
207
+ {
208
+ rules: {
209
+ 'comma-dangle': [2, 'always-multiline'],
210
+ },
211
+ },
212
+ );
213
+ `;
214
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
package/dist/kit.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { Config } from '@sveltejs/kit';
2
+ import type { UserConfig } from 'vite';
3
+ export declare function svelteConfig(root: string): Promise<Config>;
4
+ export declare function viteConfig(root: string): Promise<UserConfig>;
package/dist/kit.js ADDED
@@ -0,0 +1,180 @@
1
+ import fs from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import path from 'node:path';
4
+ import adapter from '@sveltejs/adapter-static';
5
+ import { sveltekit } from '@sveltejs/kit/vite';
6
+ import { markdownPreprocessors } from '@mvarble/mesearch-markdown';
7
+ import { rehypeDemoteHeadings } from "./headings.js";
8
+ import { appDir, packageDir } from "./paths.js";
9
+ import { openProject } from "./project.js";
10
+ import { pinDependencies } from "./resolve.js";
11
+ // The SvelteKit config a project is built with. A project has no
12
+ // `svelte.config.js` of its own: the CLI writes one into `.mesearch/` that only
13
+ // calls this.
14
+ export async function svelteConfig(root) {
15
+ const project = await openProject(root);
16
+ const { cms, config } = project;
17
+ const staticDir = path.join(root, 'static');
18
+ return {
19
+ extensions: ['.svelte', '.svx', '.md'],
20
+ preprocess: markdownPreprocessors({
21
+ remarkPlugins: [cms.remark],
22
+ rehypePlugins: [rehypeDemoteHeadings],
23
+ katex: { macros: cms.macrosFor, label: 'mesearch', watch: project.watch },
24
+ mathBox: { liftTags: true },
25
+ watch: project.watch,
26
+ }),
27
+ compilerOptions: {
28
+ // mesearch's own components are written in runes mode; a
29
+ // project's documents and components are left to Svelte to
30
+ // detect, so either style works there.
31
+ runes: ({ filename }) => (filename && isInside(appDir, filename) ? true : undefined),
32
+ },
33
+ kit: {
34
+ adapter: adapter({ pages: project.outDir, assets: project.outDir, strict: true }),
35
+ outDir: path.join(project.workDir, 'kit'),
36
+ files: {
37
+ routes: path.join(appDir, 'routes'),
38
+ lib: path.join(appDir, 'lib'),
39
+ params: path.join(appDir, 'params'),
40
+ appTemplate: path.join(appDir, 'app.html'),
41
+ errorTemplate: path.join(appDir, 'error.html'),
42
+ hooks: {
43
+ client: path.join(appDir, 'hooks.client'),
44
+ server: path.join(appDir, 'hooks.server'),
45
+ universal: path.join(appDir, 'hooks'),
46
+ },
47
+ serviceWorker: path.join(appDir, 'service-worker'),
48
+ assets: fs.existsSync(staticDir) ? staticDir : path.join(appDir, 'static'),
49
+ },
50
+ paths: { base: config.base },
51
+ alias: { $content: project.contentDir },
52
+ prerender: {
53
+ entries: ['*'],
54
+ // A broken link in a document is the author's to fix, not a
55
+ // reason to refuse to build the rest of the site.
56
+ handleHttpError: 'warn',
57
+ handleMissingId: 'warn',
58
+ },
59
+ },
60
+ };
61
+ }
62
+ // The Vite config. The CLI writes a `vite.config.js` into `.mesearch/` that
63
+ // only calls this, so that SvelteKit --- which re-reads the config file for
64
+ // its own builds --- sees exactly what the CLI does.
65
+ export async function viteConfig(root) {
66
+ const project = await openProject(root);
67
+ return {
68
+ root: project.workDir,
69
+ cacheDir: path.join(project.workDir, 'vite'),
70
+ envDir: root,
71
+ plugins: [...project.cms.vite(), sitePlugin(project), ...pinDependencies(), sveltekit()],
72
+ server: {
73
+ fs: { allow: [root, packageDir, ...dependencyRoots()] },
74
+ },
75
+ optimizeDeps: {
76
+ // The app ships as Svelte source inside this package, which Vite
77
+ // would otherwise try to pre-bundle as if it were a library. And
78
+ // Svelte itself is never pre-bundled: a project's documents reach
79
+ // it from outside this package, the app from inside, and a
80
+ // pre-bundled copy for one and the source for the other would be
81
+ // two runtimes.
82
+ exclude: [
83
+ '@mvarble/mesearch',
84
+ '@mvarble/mesearch-cms',
85
+ '@mvarble/mesearch-markdown',
86
+ '@mvarble/mesearch-ui',
87
+ 'svelte',
88
+ ],
89
+ },
90
+ ssr: { noExternal: ['@mvarble/mesearch', '@mvarble/mesearch-ui'] },
91
+ build: {
92
+ chunkSizeWarningLimit: 2000,
93
+ // A report on how long each plugin took is for whoever works on
94
+ // mesearch, not for someone building their notes.
95
+ rolldownOptions: { checks: { pluginTimings: false } },
96
+ },
97
+ };
98
+ }
99
+ const require = createRequire(import.meta.url);
100
+ const SITE_ID = '$site';
101
+ const USER_CSS_ID = '$site/user-styles';
102
+ // What the app needs to know about the site that is not content: its title
103
+ // and base, the graph's tuning, and the project's own stylesheet.
104
+ function sitePlugin(project) {
105
+ return {
106
+ name: 'mesearch:site',
107
+ enforce: 'pre',
108
+ resolveId(id) {
109
+ if (id == SITE_ID || id == USER_CSS_ID)
110
+ return `\0${id}`;
111
+ return null;
112
+ },
113
+ load(id) {
114
+ if (id == `\0${SITE_ID}`) {
115
+ const { title, author, lang, base, graph, katexMacros } = project.config;
116
+ const site = { title, author, lang, base, graph, katexMacros };
117
+ return `export default ${JSON.stringify(site)};\n`;
118
+ }
119
+ if (id == `\0${USER_CSS_ID}`) {
120
+ return project.userCss ? `import ${JSON.stringify(project.userCss)};\n` : '';
121
+ }
122
+ return null;
123
+ },
124
+ configureServer(server) {
125
+ // Outside Vite's root, so watched explicitly. A change to the
126
+ // config means a different site, so the server starts over.
127
+ const config = project.config.file;
128
+ if (config) {
129
+ server.watcher.add(config);
130
+ server.watcher.on('change', (file) => {
131
+ if (path.resolve(file) == config) {
132
+ console.log('mesearch: the config changed, restarting');
133
+ void server.restart();
134
+ }
135
+ });
136
+ }
137
+ const css = path.join(project.root, 'mesearch.css');
138
+ server.watcher.add(css);
139
+ server.watcher.on('add', (file) => {
140
+ if (path.resolve(file) == css && !project.userCss) {
141
+ console.log('mesearch: found mesearch.css, restarting');
142
+ void server.restart();
143
+ }
144
+ });
145
+ },
146
+ };
147
+ }
148
+ const isInside = (dir, file) => file == dir || file.startsWith(dir + path.sep);
149
+ // Packages whose files --- fonts, mostly --- the dev server serves directly.
150
+ // Under pnpm they sit beside this package rather than inside it.
151
+ function dependencyRoots() {
152
+ const roots = new Set();
153
+ const add = (from, name) => {
154
+ try {
155
+ const root = path.dirname(from.resolve(`${name}/package.json`));
156
+ roots.add(root);
157
+ return root;
158
+ }
159
+ catch {
160
+ // Not installed where expected; Vite will say so if it matters.
161
+ return undefined;
162
+ }
163
+ };
164
+ add(require, 'katex');
165
+ // The fonts are the UI package's dependencies, found from there.
166
+ const ui = add(require, '@mvarble/mesearch-ui');
167
+ if (ui) {
168
+ const fromUi = createRequire(path.join(ui, 'package.json'));
169
+ for (const name of [
170
+ 'katex',
171
+ '@fontsource-variable/inter',
172
+ '@fontsource-variable/source-serif-4',
173
+ '@fontsource/fira-mono',
174
+ ]) {
175
+ add(fromUi, name);
176
+ }
177
+ }
178
+ return [...roots];
179
+ }
180
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const packageDir: string;
2
+ export declare const appDir: string;
3
+ export declare const templatesDir: string;
4
+ export declare const WORK_DIR = ".mesearch";
5
+ export declare const BUILD_DIR = "build";
6
+ export declare const CONTENT_DIR = "content";
7
+ export declare const CONFIG_FILES: string[];
8
+ export declare const USER_CSS = "mesearch.css";
package/dist/paths.js ADDED
@@ -0,0 +1,16 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ // `dist/paths.js` sits one directory below the package root.
4
+ export const packageDir = path.resolve(fileURLToPath(new URL('.', import.meta.url)), '..');
5
+ // The SvelteKit app every site is built with, shipped as source.
6
+ export const appDir = path.join(packageDir, 'app');
7
+ // What `mesearch init` writes into a project.
8
+ export const templatesDir = path.join(packageDir, 'templates');
9
+ // Inside a project: where mesearch keeps its generated SvelteKit scaffolding,
10
+ // and where a build writes the site by default.
11
+ export const WORK_DIR = '.mesearch';
12
+ export const BUILD_DIR = 'build';
13
+ export const CONTENT_DIR = 'content';
14
+ export const CONFIG_FILES = ['mesearch.config.ts', 'mesearch.config.js', 'mesearch.config.mjs'];
15
+ export const USER_CSS = 'mesearch.css';
16
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAE3F,iEAAiE;AACjE,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAEnD,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAE/D,8EAA8E;AAC9E,gDAAgD;AAChD,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,qBAAqB,CAAC,CAAC;AAChG,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type Cms } from '@mvarble/mesearch-cms';
2
+ import { type ResolvedConfig } from './config.ts';
3
+ export interface Project {
4
+ root: string;
5
+ contentDir: string;
6
+ workDir: string;
7
+ config: ResolvedConfig;
8
+ cms: Cms;
9
+ userCss?: string;
10
+ outDir: string;
11
+ watch: boolean;
12
+ }
13
+ export interface ProjectOptions {
14
+ outDir?: string;
15
+ base?: string;
16
+ watch?: boolean;
17
+ }
18
+ export declare const ENV: {
19
+ outDir: string;
20
+ base: string;
21
+ watch: string;
22
+ };
23
+ export declare function exportOptions(options: ProjectOptions): void;
24
+ export declare function findRoot(from: string): string;
25
+ export declare function openProject(root: string, given?: ProjectOptions): Promise<Project>;
26
+ export declare function closeProject(root: string): void;
@@ -0,0 +1,92 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createCms } from '@mvarble/mesearch-cms';
4
+ import { mesearchPreset } from '@mvarble/mesearch-cms/presets/mesearch';
5
+ import { loadConfig } from "./config.js";
6
+ import { BUILD_DIR, CONTENT_DIR, USER_CSS, WORK_DIR } from "./paths.js";
7
+ // The CLI's options also travel through the environment: SvelteKit prerenders
8
+ // in a child process, which reads the project afresh and has to agree with
9
+ // the parent about where the site goes and what it is served under.
10
+ export const ENV = { outDir: 'MESEARCH_OUT_DIR', base: 'MESEARCH_BASE', watch: 'MESEARCH_WATCH' };
11
+ export function exportOptions(options) {
12
+ if (options.outDir !== undefined)
13
+ process.env[ENV.outDir] = path.resolve(options.outDir);
14
+ if (options.base !== undefined)
15
+ process.env[ENV.base] = options.base;
16
+ if (options.watch !== undefined)
17
+ process.env[ENV.watch] = options.watch ? '1' : '';
18
+ }
19
+ // The project a directory belongs to: the nearest one up the tree with a
20
+ // `package.json` that depends on mesearch, or with a `content/` folder, or else
21
+ // the directory itself.
22
+ export function findRoot(from) {
23
+ for (let dir = path.resolve(from);; dir = path.dirname(dir)) {
24
+ const manifest = path.join(dir, 'package.json');
25
+ if (fs.existsSync(manifest)) {
26
+ try {
27
+ const data = JSON.parse(fs.readFileSync(manifest, 'utf8'));
28
+ const deps = {
29
+ ...data.dependencies,
30
+ ...data.devDependencies,
31
+ };
32
+ if ('@mvarble/mesearch' in deps)
33
+ return dir;
34
+ }
35
+ catch {
36
+ // An unreadable manifest is not this project's.
37
+ }
38
+ }
39
+ if (fs.existsSync(path.join(dir, CONTENT_DIR)))
40
+ return dir;
41
+ if (path.dirname(dir) == dir)
42
+ return path.resolve(from);
43
+ }
44
+ }
45
+ // The SvelteKit config, the Vite config and the CLI all need the one content
46
+ // store, so that what the markdown pipeline resolves and what the routes query
47
+ // are the same. They are loaded as separate module instances --- Vite bundles
48
+ // its config file, SvelteKit imports its own --- so the project is shared
49
+ // through a global keyed by its root.
50
+ const KEY = (root) => Symbol.for(`mesearch:project:${root}`);
51
+ export async function openProject(root, given = {}) {
52
+ const options = {
53
+ outDir: given.outDir ?? process.env[ENV.outDir],
54
+ base: given.base ?? process.env[ENV.base],
55
+ watch: given.watch ?? !!process.env[ENV.watch],
56
+ };
57
+ const registry = globalThis;
58
+ const existing = registry[KEY(root)];
59
+ if (existing)
60
+ return existing;
61
+ const project = (async () => {
62
+ const config = await loadConfig(root);
63
+ if (options.base !== undefined)
64
+ config.base = options.base == '/' ? '' : options.base.replace(/\/+$/, '');
65
+ const cms = createCms({
66
+ root,
67
+ preset: mesearchPreset({ contentDir: CONTENT_DIR, base: config.base }),
68
+ macros: config.katexMacros,
69
+ virtualId: '$cms',
70
+ label: 'mesearch',
71
+ reload: 'data',
72
+ });
73
+ const userCss = path.join(root, USER_CSS);
74
+ return {
75
+ root,
76
+ contentDir: path.join(root, CONTENT_DIR),
77
+ workDir: path.join(root, WORK_DIR),
78
+ config,
79
+ cms,
80
+ userCss: fs.existsSync(userCss) ? userCss : undefined,
81
+ outDir: path.resolve(root, options.outDir ?? BUILD_DIR),
82
+ watch: options.watch ?? false,
83
+ };
84
+ })();
85
+ registry[KEY(root)] = project;
86
+ return project;
87
+ }
88
+ // Forget a project, so the next `openProject` reads its config afresh.
89
+ export function closeProject(root) {
90
+ delete globalThis[KEY(root)];
91
+ }
92
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Plugin } from 'vite';
2
+ export declare function pinDependencies(): Plugin[];
@@ -0,0 +1,51 @@
1
+ import path from 'node:path';
2
+ import { appDir, packageDir } from "./paths.js";
3
+ // Packages a site must share with mesearch rather than resolve for itself. Two
4
+ // copies of Svelte make two runtimes, and the first component rendered by the
5
+ // other one fails; SvelteKit's generated files import its runtime by name.
6
+ const PINNED = ['svelte', '@sveltejs/kit', 'esm-env', 'devalue'];
7
+ const isPinned = (id) => PINNED.some((name) => id == name || id.startsWith(name + '/'));
8
+ // Neither relative, nor absolute, nor a URL, nor a virtual id.
9
+ const BARE_IMPORT = /^(?![a-zA-Z]:)[\w@](?!.*:\/\/)/;
10
+ const isInside = (dir, file) => file == dir || file.startsWith(dir + path.sep);
11
+ // A site's documents live in its own `content/`, and SvelteKit's generated files
12
+ // in `.mesearch/` --- neither of which has mesearch's dependencies above it
13
+ // when a package manager keeps them private, as pnpm does.
14
+ //
15
+ // So the packages that must be shared are always resolved as if mesearch
16
+ // imported them, and any other bare import that the project cannot resolve
17
+ // is tried from mesearch too. A document's own imports --- a `three` the
18
+ // project installed, say --- still resolve from the project first.
19
+ export function pinDependencies() {
20
+ // Resolved as if one of the app's own files imported them --- not merely
21
+ // from somewhere inside the package --- because that is what decides,
22
+ // during development, whether Vite hands out its pre-bundled copy. Any
23
+ // other importer gets the package's raw source: a second Svelte runtime.
24
+ const importer = path.join(appDir, 'routes', '+layout.svelte');
25
+ return [
26
+ {
27
+ name: 'mesearch:pin',
28
+ enforce: 'pre',
29
+ async resolveId(id, from, options) {
30
+ if (!from || !isPinned(id) || id.includes('\0'))
31
+ return null;
32
+ const file = from.replace(/[?#].*$/, '');
33
+ if (isInside(packageDir, file))
34
+ return null;
35
+ return this.resolve(id, importer, { ...options, skipSelf: true });
36
+ },
37
+ },
38
+ {
39
+ name: 'mesearch:fallback',
40
+ enforce: 'post',
41
+ async resolveId(id, from, options) {
42
+ if (!from || !BARE_IMPORT.test(id) || id.includes('\0'))
43
+ return null;
44
+ if (isInside(packageDir, from.replace(/[?#].*$/, '')))
45
+ return null;
46
+ return this.resolve(id, importer, { ...options, skipSelf: true });
47
+ },
48
+ },
49
+ ];
50
+ }
51
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhD,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAEjE,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;AAEhG,+DAA+D;AAC/D,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAErD,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/F,iFAAiF;AACjF,4EAA4E;AAC5E,2DAA2D;AAC3D,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,UAAU,eAAe;IAC3B,yEAAyE;IACzE,sEAAsE;IACtE,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC/D,OAAO;QACH;YACI,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO;gBAC7B,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACzC,IAAI,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,CAAC;SACJ;QACD;YACI,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,MAAM;YACf,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO;gBAC7B,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACrE,IAAI,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACnE,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,CAAC;SACJ;KACJ,CAAC;AACN,CAAC"}