@fairgarden/monolith 0.1.0-0.canary.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 (54) hide show
  1. package/Readme.md +84 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +160 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/compat.d.ts +4 -0
  7. package/dist/compat.d.ts.map +1 -0
  8. package/dist/compat.js +174 -0
  9. package/dist/compat.js.map +1 -0
  10. package/dist/eslint.d.ts +62 -0
  11. package/dist/eslint.d.ts.map +1 -0
  12. package/dist/eslint.js +198 -0
  13. package/dist/eslint.js.map +1 -0
  14. package/dist/index.d.ts +28 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +84 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/link.d.ts +24 -0
  19. package/dist/link.d.ts.map +1 -0
  20. package/dist/link.js +473 -0
  21. package/dist/link.js.map +1 -0
  22. package/dist/mounts.d.ts +37 -0
  23. package/dist/mounts.d.ts.map +1 -0
  24. package/dist/mounts.js +58 -0
  25. package/dist/mounts.js.map +1 -0
  26. package/dist/package-json.d.ts +38 -0
  27. package/dist/package-json.d.ts.map +1 -0
  28. package/dist/package-json.js +156 -0
  29. package/dist/package-json.js.map +1 -0
  30. package/dist/portability.d.ts +41 -0
  31. package/dist/portability.d.ts.map +1 -0
  32. package/dist/portability.js +171 -0
  33. package/dist/portability.js.map +1 -0
  34. package/dist/portable-link.d.ts +22 -0
  35. package/dist/portable-link.d.ts.map +1 -0
  36. package/dist/portable-link.js +24 -0
  37. package/dist/portable-link.js.map +1 -0
  38. package/dist/proxies.d.ts +33 -0
  39. package/dist/proxies.d.ts.map +1 -0
  40. package/dist/proxies.js +177 -0
  41. package/dist/proxies.js.map +1 -0
  42. package/dist/resolve.d.ts +5 -0
  43. package/dist/resolve.d.ts.map +1 -0
  44. package/dist/resolve.js +181 -0
  45. package/dist/resolve.js.map +1 -0
  46. package/dist/routes.d.ts +23 -0
  47. package/dist/routes.d.ts.map +1 -0
  48. package/dist/routes.js +102 -0
  49. package/dist/routes.js.map +1 -0
  50. package/dist/types.d.ts +111 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +77 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxies.js","sourceRoot":"","sources":["../src/proxies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { MonolithApps, ResolvedApp } from './types.ts';
2
+ /** Where an app's files were taken from, when more than one source was offered. */
3
+ export type AppSource = 'path' | 'package';
4
+ export declare const resolveApps: (monolithRoot: string, apps: MonolithApps, phase: string) => Promise<ResolvedApp[]>;
5
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAe,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAqCxE,mFAAmF;AACnF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AA+H1C,eAAO,MAAM,WAAW,GACtB,cAAc,MAAM,EACpB,MAAM,YAAY,EAClB,OAAO,MAAM,KACZ,OAAO,CAAC,WAAW,EAAE,CAqDrB,CAAA"}
@@ -0,0 +1,181 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { createRequire } from 'node:module';
10
+ import { readFileSync, realpathSync, statSync } from 'node:fs';
11
+ import path from 'node:path';
12
+ import { pathToFileURL } from 'node:url';
13
+ /** Config file names Next itself accepts, in the order Next looks for them. */
14
+ const CONFIG_FILES = [
15
+ 'next.config.ts',
16
+ 'next.config.mts',
17
+ 'next.config.js',
18
+ 'next.config.mjs',
19
+ 'next.config.cjs',
20
+ ];
21
+ const isDirectory = (candidate) => {
22
+ try {
23
+ return statSync(candidate).isDirectory();
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ };
29
+ const isFile = (candidate) => {
30
+ try {
31
+ return statSync(candidate).isFile();
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ };
37
+ /** Mount names become URL segments, so keep them to something safe. */
38
+ const assertMountName = (name) => {
39
+ if (!/^[a-z0-9][a-z0-9-_]*$/i.test(name)) {
40
+ throw new Error(`Monolith app name ${JSON.stringify(name)} is not usable as a URL segment. ` +
41
+ 'Use letters, digits, dashes and underscores.');
42
+ }
43
+ };
44
+ const resolvePackage = (monolithRoot, pkg) => {
45
+ const require = createRequire(path.join(monolithRoot, 'package.json'));
46
+ let resolved;
47
+ try {
48
+ resolved = path.dirname(require.resolve(`${pkg}/package.json`));
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ // A workspace package resolves through node_modules but is a link to the
54
+ // checkout, so it is the same thing as naming its path: it belongs in the
55
+ // committed tree and can be symlinked, not copied.
56
+ const real = realpathSync.native(resolved);
57
+ const installed = real.split(path.sep).includes('node_modules');
58
+ return { source: installed ? 'package' : 'path', root: real };
59
+ };
60
+ /**
61
+ * An app checked out at a path is usable only if its routes are actually there.
62
+ *
63
+ * A submodule that was never cloned leaves an empty directory behind, which is
64
+ * what a build host produces when it cannot read the submodule's remote.
65
+ */
66
+ const hasRoutes = (root, app) => {
67
+ if (app.appDir)
68
+ return isDirectory(path.resolve(root, app.appDir));
69
+ // Only an App Router tree counts: resolveApps requires one, so accepting a
70
+ // pages-only checkout here would pick it and then fail instead of trying the
71
+ // package that was offered as a fallback.
72
+ return [path.join(root, 'app'), path.join(root, 'src', 'app')].some(isDirectory);
73
+ };
74
+ /**
75
+ * Locate an app on disk.
76
+ *
77
+ * Paths are taken relative to the monolith and packages are resolved from
78
+ * node_modules. Both may be given, and then the checkout wins when it is
79
+ * there and the package is the fallback — which is how a private module can
80
+ * still build somewhere that could not clone the submodule but can install
81
+ * the package.
82
+ */
83
+ const resolveRoot = (monolithRoot, name, app) => {
84
+ const candidates = [];
85
+ if (app.root) {
86
+ candidates.push({ source: 'path', root: path.resolve(monolithRoot, app.root) });
87
+ }
88
+ if (app.package) {
89
+ const resolved = resolvePackage(monolithRoot, app.package);
90
+ if (resolved)
91
+ candidates.push(resolved);
92
+ }
93
+ if (candidates.length === 0) {
94
+ if (app.package) {
95
+ throw new Error(`Could not resolve monolith app ${JSON.stringify(name)} from package ` +
96
+ `${JSON.stringify(app.package)}. Is it a dependency of the monolith?`);
97
+ }
98
+ throw new Error(`Monolith app ${JSON.stringify(name)} needs either "root" or "package".`);
99
+ }
100
+ const usable = candidates.find((candidate) => isDirectory(candidate.root) && hasRoutes(candidate.root, app));
101
+ if (usable)
102
+ return usable;
103
+ // Nothing usable: say which places were looked at rather than just the last.
104
+ const looked = candidates
105
+ .map((candidate) => `${candidate.source} ${candidate.root}`)
106
+ .join(', ');
107
+ throw new Error(`Monolith app ${JSON.stringify(name)} has no routes directory. Looked at ${looked}. ` +
108
+ 'An empty directory here is usually a submodule that was never cloned.');
109
+ };
110
+ /** A bare string is a path when it looks like one, otherwise a package name. */
111
+ const normalize = (entry) => {
112
+ if (typeof entry !== 'string')
113
+ return entry;
114
+ return entry.startsWith('.') || path.isAbsolute(entry)
115
+ ? { root: entry }
116
+ : { package: entry };
117
+ };
118
+ const readPackageName = (root) => {
119
+ try {
120
+ const pkg = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf8'));
121
+ return typeof pkg.name === 'string' ? pkg.name : undefined;
122
+ }
123
+ catch {
124
+ return undefined;
125
+ }
126
+ };
127
+ const loadNextConfig = async (root, phase, name) => {
128
+ const configPath = CONFIG_FILES.map((file) => path.join(root, file)).find(isFile);
129
+ if (!configPath)
130
+ return {};
131
+ let loaded;
132
+ try {
133
+ loaded = (await import(__rewriteRelativeImportExtension(pathToFileURL(configPath).href))).default;
134
+ }
135
+ catch (cause) {
136
+ throw new Error(`Failed to load the Next config for monolith app ${JSON.stringify(name)} ` +
137
+ `at ${configPath}.`, { cause });
138
+ }
139
+ const config = typeof loaded === 'function' ? await loaded(phase) : loaded;
140
+ return (config ?? {});
141
+ };
142
+ export const resolveApps = async (monolithRoot, apps, phase) => Promise.all(Object.entries(apps).map(async ([name, entry]) => {
143
+ assertMountName(name);
144
+ const app = normalize(entry);
145
+ const { root, source } = resolveRoot(monolithRoot, name, app);
146
+ const appDir = app.appDir
147
+ ? path.resolve(root, app.appDir)
148
+ : [path.join(root, 'app'), path.join(root, 'src', 'app')].find(isDirectory);
149
+ if (!appDir || !isDirectory(appDir)) {
150
+ throw new Error(`Monolith app ${JSON.stringify(name)} has no routes directory. ` +
151
+ `Looked for "app/" and "src/app/" in ${root}.`);
152
+ }
153
+ const publicDirCandidate = app.publicDir
154
+ ? path.resolve(root, app.publicDir)
155
+ : path.join(root, 'public');
156
+ const pagesDir = app.pagesDir
157
+ ? path.resolve(root, app.pagesDir)
158
+ : [path.join(root, 'pages'), path.join(root, 'src', 'pages')].find(isDirectory);
159
+ const pagesApiDir = pagesDir && isDirectory(path.join(pagesDir, 'api'))
160
+ ? path.join(pagesDir, 'api')
161
+ : undefined;
162
+ const nextConfig = app.nextConfig === false
163
+ ? {}
164
+ : (app.nextConfig ??
165
+ (await loadNextConfig(root, phase, name)));
166
+ return {
167
+ name,
168
+ // '' rather than '/', so prefixing a path is a plain concatenation.
169
+ prefix: app.prefix === '/' || app.prefix === '' ? '' : (app.prefix ?? `/${name}`),
170
+ root,
171
+ packageName: readPackageName(root),
172
+ source,
173
+ appDir,
174
+ publicDir: isDirectory(publicDirCandidate) ? publicDirCandidate : undefined,
175
+ pagesDir: pagesDir && isDirectory(pagesDir) ? pagesDir : undefined,
176
+ pagesApiDir,
177
+ apiViaPages: pagesApiDir !== undefined,
178
+ nextConfig: typeof nextConfig === 'function' ? await nextConfig(phase) : nextConfig,
179
+ };
180
+ }));
181
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { NextConfig } from 'next';
2
+ import type { ResolvedApp } from './types.ts';
3
+ /**
4
+ * Move a path into an app's mount point.
5
+ *
6
+ * Absolute URLs and Next's internal paths are left alone; everything else is a
7
+ * route belonging to the app and moves under `/<name>`.
8
+ *
9
+ * Pages Router API routes are the one exception. Next only treats files
10
+ * directly under `pages/api/` as API routes, so an app's `pages/api` mounts at
11
+ * `pages/api/<name>` and its paths become `/api/<name>/...` — the prefix goes
12
+ * after `/api`, not before it.
13
+ */
14
+ export declare const prefixPath: (value: string, prefix: string, apiViaPages?: boolean) => string;
15
+ /**
16
+ * Build the monolith's `rewrites`, keeping each phase's ordering: the
17
+ * monolith's own entries stay ahead of the apps', and apps keep the order they
18
+ * were declared in.
19
+ */
20
+ export declare const mergeRewrites: (base: NextConfig, apps: ResolvedApp[]) => Promise<NonNullable<NextConfig["rewrites"]>>;
21
+ export declare const mergeRedirects: (base: NextConfig, apps: ResolvedApp[]) => Promise<NonNullable<NextConfig["redirects"]>>;
22
+ export declare const mergeHeaders: (base: NextConfig, apps: ResolvedApp[]) => Promise<NonNullable<NextConfig["headers"]>>;
23
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAU7C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,qBAAmB,KAClB,MAWF,CAAA;AAoDD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,UAAU,EAChB,MAAM,WAAW,EAAE,KAClB,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAiB7C,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,MAAM,UAAU,EAChB,MAAM,WAAW,EAAE,KAClB,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAS9C,CAAA;AAED,eAAO,MAAM,YAAY,GACvB,MAAM,UAAU,EAChB,MAAM,WAAW,EAAE,KAClB,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAS5C,CAAA"}
package/dist/routes.js ADDED
@@ -0,0 +1,102 @@
1
+ /** Next's own internals are served from the monolith root, never per app. */
2
+ const RESERVED = ['/_next/', '/__next', '/api/__'];
3
+ /**
4
+ * Move a path into an app's mount point.
5
+ *
6
+ * Absolute URLs and Next's internal paths are left alone; everything else is a
7
+ * route belonging to the app and moves under `/<name>`.
8
+ *
9
+ * Pages Router API routes are the one exception. Next only treats files
10
+ * directly under `pages/api/` as API routes, so an app's `pages/api` mounts at
11
+ * `pages/api/<name>` and its paths become `/api/<name>/...` — the prefix goes
12
+ * after `/api`, not before it.
13
+ */
14
+ export const prefixPath = (value, prefix, apiViaPages = false) => {
15
+ // An app served at the site root has nothing to prefix, and '/' must stay
16
+ // '/' rather than becoming the empty prefix.
17
+ if (prefix === '')
18
+ return value;
19
+ if (!value.startsWith('/'))
20
+ return value;
21
+ if (RESERVED.some((reserved) => value.startsWith(reserved)))
22
+ return value;
23
+ if (apiViaPages && (value === '/api' || value.startsWith('/api/'))) {
24
+ return `/api${prefix}${value.slice('/api'.length)}`;
25
+ }
26
+ if (value === '/')
27
+ return prefix;
28
+ return `${prefix}${value}`;
29
+ };
30
+ const prefixRewrite = (rewrite, app) => ({
31
+ ...rewrite,
32
+ source: prefixPath(rewrite.source, app.prefix, app.apiViaPages),
33
+ destination: prefixPath(rewrite.destination, app.prefix, app.apiViaPages),
34
+ });
35
+ const prefixRedirect = (redirect, app) => ({
36
+ ...redirect,
37
+ source: prefixPath(redirect.source, app.prefix, app.apiViaPages),
38
+ destination: prefixPath(redirect.destination, app.prefix, app.apiViaPages),
39
+ });
40
+ /**
41
+ * A `Link` header names paths too — `</theme.css>; rel=preload` — and they
42
+ * move with the rest. Only root-relative targets: a protocol-relative one is
43
+ * another host.
44
+ */
45
+ const prefixLink = (value, app) => value.replace(/<(\/(?!\/)[^>]*)>/g, (_, target) => `<${prefixPath(target, app.prefix, app.apiViaPages)}>`);
46
+ const prefixHeader = (header, app) => ({
47
+ ...header,
48
+ source: prefixPath(header.source, app.prefix, app.apiViaPages),
49
+ headers: header.headers.map((entry) => entry.key.toLowerCase() === 'link' ? { ...entry, value: prefixLink(entry.value, app) } : entry),
50
+ });
51
+ /** Rewrites are either a flat list or the three-phase object; normalize both. */
52
+ const toPhases = (rewrites) => {
53
+ if (!rewrites)
54
+ return { beforeFiles: [], afterFiles: [], fallback: [] };
55
+ if (Array.isArray(rewrites)) {
56
+ return { beforeFiles: [], afterFiles: rewrites, fallback: [] };
57
+ }
58
+ return {
59
+ beforeFiles: (rewrites.beforeFiles ?? []),
60
+ afterFiles: (rewrites.afterFiles ?? []),
61
+ fallback: (rewrites.fallback ?? []),
62
+ };
63
+ };
64
+ const call = async (value) => (value ? await value() : undefined);
65
+ /**
66
+ * Build the monolith's `rewrites`, keeping each phase's ordering: the
67
+ * monolith's own entries stay ahead of the apps', and apps keep the order they
68
+ * were declared in.
69
+ */
70
+ export const mergeRewrites = async (base, apps) => {
71
+ return async () => {
72
+ const merged = toPhases(await call(base.rewrites));
73
+ for (const app of apps) {
74
+ const phases = toPhases(await call(app.nextConfig.rewrites));
75
+ merged.beforeFiles.push(...phases.beforeFiles.map((rule) => prefixRewrite(rule, app)));
76
+ merged.afterFiles.push(...phases.afterFiles.map((rule) => prefixRewrite(rule, app)));
77
+ merged.fallback.push(...phases.fallback.map((rule) => prefixRewrite(rule, app)));
78
+ }
79
+ return merged;
80
+ };
81
+ };
82
+ export const mergeRedirects = async (base, apps) => {
83
+ return async () => {
84
+ const merged = [...((await call(base.redirects)) ?? [])];
85
+ for (const app of apps) {
86
+ const redirects = (await call(app.nextConfig.redirects)) ?? [];
87
+ merged.push(...redirects.map((rule) => prefixRedirect(rule, app)));
88
+ }
89
+ return merged;
90
+ };
91
+ };
92
+ export const mergeHeaders = async (base, apps) => {
93
+ return async () => {
94
+ const merged = [...((await call(base.headers)) ?? [])];
95
+ for (const app of apps) {
96
+ const headers = (await call(app.nextConfig.headers)) ?? [];
97
+ merged.push(...headers.map((rule) => prefixHeader(rule, app)));
98
+ }
99
+ return merged;
100
+ };
101
+ };
102
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { NextConfig } from 'next';
2
+ /**
3
+ * How the routes Next reads are produced from the committed source tree.
4
+ *
5
+ * The symlinks under `src/app/` are the readable view — they are committed, and
6
+ * GitHub renders them as links you can follow to the app they point at. What
7
+ * Next reads is derived from them:
8
+ *
9
+ * - `source` produces nothing. `next build` follows the committed symlinks, so
10
+ * it reads `src/app/` directly and there is no generated copy to go stale.
11
+ * - `mirror` recreates the tree at `app/` and symlinks each file. `next dev`
12
+ * does not discover routes through a symlinked *directory*, but it does
13
+ * through a symlinked *file*, and because a symlink resolves by path, edits
14
+ * show up even when an editor saves by writing a new file and renaming it.
15
+ * - `hardlink` and `copy` duplicate the files, for filesystems without usable
16
+ * symlinks. Both go stale when an editor replaces a file rather than writing
17
+ * through it, so they lean on the watcher.
18
+ *
19
+ * This chooses how the App Router tree is produced. The Pages Router tree is
20
+ * always duplicated: Next resolves a route to its real path, and a Pages Router
21
+ * route reached through a symlink loses its `pages/` root, which surfaces as a
22
+ * missing `/_document` when the 404 is rendered.
23
+ */
24
+ export type LinkStrategy = 'source' | 'mirror' | 'hardlink' | 'copy';
25
+ export interface MonolithApp {
26
+ /** Directory of the app, relative to the monolith. */
27
+ root?: string;
28
+ /**
29
+ * Package to resolve the app from, e.g. `@fairgarden/id`.
30
+ *
31
+ * May be given alongside `root`, and is then the fallback: the checkout is
32
+ * used when its routes are there, and the package when they are not. That is
33
+ * what lets a private module build somewhere that could install the package
34
+ * but not clone the submodule.
35
+ */
36
+ package?: string;
37
+ /** Routes directory. Defaults to `app/`, falling back to `src/app/`. */
38
+ appDir?: string;
39
+ /** Static asset directory. Defaults to `public/`, omitted when absent. */
40
+ publicDir?: string;
41
+ /**
42
+ * Pages Router directory. Defaults to `pages/`, falling back to `src/pages/`,
43
+ * and omitted when absent.
44
+ */
45
+ pagesDir?: string;
46
+ /**
47
+ * Path to serve this app at. Defaults to `/<mount name>`.
48
+ *
49
+ * `/` serves it at the site root, which is what a `www` app wants: its
50
+ * routes become `/about` rather than `/www/about`. Only one app can have it,
51
+ * and its files sit alongside the monolith's own rather than under a
52
+ * directory of their own.
53
+ */
54
+ prefix?: string;
55
+ /**
56
+ * Config to merge for this app. Defaults to the app's own `next.config.*`.
57
+ * Pass `false` to mount the routes without merging any config.
58
+ */
59
+ nextConfig?: NextConfig | NextConfigFn | false;
60
+ }
61
+ export type NextConfigFn = (phase: string) => NextConfig | Promise<NextConfig>;
62
+ /** Mount name -> app. A bare string is shorthand for a package name or path. */
63
+ export type MonolithApps = Record<string, string | MonolithApp>;
64
+ export interface MonolithOptions {
65
+ /**
66
+ * Defaults to `auto`: `symlink` for builds, `hardlink` for `next dev`.
67
+ * @see LinkStrategy
68
+ */
69
+ strategy?: LinkStrategy | 'auto';
70
+ /** Monolith directory. Defaults to `process.cwd()`. */
71
+ root?: string;
72
+ /**
73
+ * Committed routes directory holding the app symlinks, relative to the
74
+ * monolith. Defaults to `src/app`. Next reads it directly during builds.
75
+ * The Pages Router tree is its `pages` sibling — `src/pages` by default.
76
+ */
77
+ sourceDir?: string;
78
+ /** Watch each app for changes. Defaults to true when mirroring for `next dev`. */
79
+ watch?: boolean;
80
+ /**
81
+ * Make each app resolvable by its own package name from inside itself.
82
+ * Defaults to true. @see linkSelfReference
83
+ */
84
+ selfReference?: boolean;
85
+ }
86
+ export interface ResolvedApp {
87
+ /** Mount name; routes are served under `/<name>`. */
88
+ name: string;
89
+ /** Path prefix the app is mounted at, e.g. `/id`. */
90
+ prefix: string;
91
+ root: string;
92
+ /** The app's own package name, when it has one. */
93
+ packageName: string | undefined;
94
+ /** Whether the files came from the checkout or from node_modules. */
95
+ source: 'path' | 'package';
96
+ appDir: string;
97
+ publicDir: string | undefined;
98
+ pagesDir: string | undefined;
99
+ /** The app's `pages/api`, when it has one. */
100
+ pagesApiDir: string | undefined;
101
+ /**
102
+ * Whether `/api/...` paths in this app's config are Pages Router API routes.
103
+ *
104
+ * Those mount at `/api/<name>/...`, because Next only treats files directly
105
+ * under `pages/api/` as API routes — so unlike every other path, the prefix
106
+ * goes after `/api`, not before it.
107
+ */
108
+ apiViaPages: boolean;
109
+ nextConfig: NextConfig;
110
+ }
111
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAEtC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAA;AAEpE,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,KAAK,CAAA;CAC/C;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAE9E,gFAAgF;AAChF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,CAAA;AAE/D,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAChC,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,8CAA8C;IAC9C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B;;;;;;OAMG;IACH,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;CACvB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@fairgarden/monolith",
3
+ "version": "0.1.0-0.canary.0",
4
+ "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48",
5
+ "description": "Compose several Next.js apps into a single deployable monolith",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/fairgarden/monolith.git"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "license": "UNLICENSED",
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./link": {
23
+ "types": "./dist/portable-link.d.ts",
24
+ "default": "./dist/portable-link.js"
25
+ },
26
+ "./eslint": {
27
+ "types": "./dist/eslint.d.ts",
28
+ "default": "./dist/eslint.js"
29
+ }
30
+ },
31
+ "bin": {
32
+ "fg-monolith": "dist/cli.js"
33
+ },
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "dev": "tsc --watch --preserveWatchOutput",
40
+ "lint": "eslint",
41
+ "test": "node --test test/*.test.js",
42
+ "canary": "fg-dist canary",
43
+ "release": "fg-dist release",
44
+ "release:check": "fg-dist release --check",
45
+ "changelog": "fg-dist changelog"
46
+ },
47
+ "dependencies": {
48
+ "@babel/parser": "^7.29.9",
49
+ "@fairgarden/distribution": "^0.1.0-alpha.2",
50
+ "merge-package.json": "^9.1.0",
51
+ "semver": "^7.8.5",
52
+ "sync-directory": "^6.0.5"
53
+ },
54
+ "devDependencies": {
55
+ "@babel/types": "^8.0.6",
56
+ "@types/babel__parser": "^7.1.5",
57
+ "@types/node": "^26.6.2",
58
+ "@types/react": "^19.3.0",
59
+ "@types/semver": "^7.8.0",
60
+ "@typescript-eslint/eslint-plugin": "^8.70.0",
61
+ "@typescript-eslint/parser": "^8.70.0",
62
+ "eslint": "^9.39.5",
63
+ "next": "^16.3.5",
64
+ "react": "^19.3.0",
65
+ "typescript": "^6.0.3"
66
+ },
67
+ "peerDependencies": {
68
+ "next": ">=15",
69
+ "react": ">=18"
70
+ },
71
+ "peerDependenciesMeta": {
72
+ "react": {
73
+ "optional": true
74
+ }
75
+ },
76
+ "gitSha": "17122a4d4045e31f73282d6bc35a01f449ce0355"
77
+ }