adjacent-cli 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.
- package/CHANGELOG.md +15 -0
- package/LICENSE +21 -0
- package/README.md +48 -0
- package/dist/arguments.d.ts +54 -0
- package/dist/arguments.d.ts.map +1 -0
- package/dist/arguments.js +68 -0
- package/dist/arguments.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +140 -0
- package/dist/bin.js.map +1 -0
- package/dist/checks.d.ts +35 -0
- package/dist/checks.d.ts.map +1 -0
- package/dist/checks.js +206 -0
- package/dist/checks.js.map +1 -0
- package/dist/create.d.ts +42 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +82 -0
- package/dist/create.js.map +1 -0
- package/dist/dependencies.d.ts +59 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +100 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/destination.d.ts +16 -0
- package/dist/destination.d.ts.map +1 -0
- package/dist/destination.js +39 -0
- package/dist/destination.js.map +1 -0
- package/dist/dev-channel.d.ts +40 -0
- package/dist/dev-channel.d.ts.map +1 -0
- package/dist/dev-channel.js +192 -0
- package/dist/dev-channel.js.map +1 -0
- package/dist/dev.d.ts +3 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +12 -0
- package/dist/dev.js.map +1 -0
- package/dist/doctor.d.ts +46 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +52 -0
- package/dist/doctor.js.map +1 -0
- package/dist/edits.d.ts +26 -0
- package/dist/edits.d.ts.map +1 -0
- package/dist/edits.js +101 -0
- package/dist/edits.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +62 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +275 -0
- package/dist/init.js.map +1 -0
- package/dist/keys.d.ts +14 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +66 -0
- package/dist/keys.js.map +1 -0
- package/dist/package-manager.d.ts +40 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/package-manager.js +98 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/process.d.ts +33 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +95 -0
- package/dist/process.js.map +1 -0
- package/dist/project-name.d.ts +30 -0
- package/dist/project-name.d.ts.map +1 -0
- package/dist/project-name.js +73 -0
- package/dist/project-name.js.map +1 -0
- package/dist/reporter.d.ts +12 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +11 -0
- package/dist/reporter.js.map +1 -0
- package/dist/rewrite.d.ts +54 -0
- package/dist/rewrite.d.ts.map +1 -0
- package/dist/rewrite.js +262 -0
- package/dist/rewrite.js.map +1 -0
- package/dist/shutdown.d.ts +24 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +67 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/survey.d.ts +33 -0
- package/dist/survey.d.ts.map +1 -0
- package/dist/survey.js +94 -0
- package/dist/survey.js.map +1 -0
- package/dist/template.d.ts +29 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +77 -0
- package/dist/template.js.map +1 -0
- package/dist/ui.d.ts +14 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +50 -0
- package/dist/ui.js.map +1 -0
- package/package.json +65 -0
- package/templates/adjacent/app/manifest.ts +5 -0
- package/templates/adjacent/app/sw.js/route.ts +5 -0
- package/templates/adjacent/app.config.ts +21 -0
- package/templates/adjacent/components/navigation.tsx +46 -0
- package/templates/adjacent/public/apple-touch-icon.png +0 -0
- package/templates/adjacent/public/favicon-96x96.png +0 -0
- package/templates/adjacent/public/favicon.ico +0 -0
- package/templates/adjacent/public/favicon.svg +4 -0
- package/templates/adjacent/public/web-app-manifest-192x192.png +0 -0
- package/templates/adjacent/public/web-app-manifest-512x512.png +0 -0
- package/templates/adjacent/public/web-app-manifest-maskable-192x192.png +0 -0
- package/templates/adjacent/public/web-app-manifest-maskable-512x512.png +0 -0
- package/templates/starter/app/(app)/layout.tsx +12 -0
- package/templates/starter/app/(app)/page.tsx +75 -0
- package/templates/starter/app/(app)/settings/page.tsx +24 -0
- package/templates/starter/app/(app)/settings/settings-panel.tsx +54 -0
package/dist/create.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type InitPorts, type InitResult } from "./init.js";
|
|
2
|
+
import { type InstallOptions, type PackageManager } from "./package-manager.js";
|
|
3
|
+
export interface CreateOptions {
|
|
4
|
+
readonly cwd?: string;
|
|
5
|
+
readonly directory?: string;
|
|
6
|
+
readonly install: boolean;
|
|
7
|
+
readonly projectName: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CreatePorts extends InitPorts {
|
|
10
|
+
/** Scaffolds the plain Next.js application Adjacent then adds itself to. */
|
|
11
|
+
readonly createNextApp?: (options: CreateNextAppOptions) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface CreateNextAppOptions {
|
|
14
|
+
readonly destination: string;
|
|
15
|
+
readonly projectName: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CreateResult extends InitResult {
|
|
18
|
+
readonly destination: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Next.js owns what a current Next.js application looks like, so Adjacent does
|
|
22
|
+
* not carry a copy of one. These flags pick the shape Adjacent supports: the
|
|
23
|
+
* App Router, TypeScript, and Tailwind, which the starter shell is written in.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createNextAppArguments(destination: string, manager: PackageManager): readonly string[];
|
|
26
|
+
export interface NextStepsOptions {
|
|
27
|
+
readonly cwd: string;
|
|
28
|
+
readonly destination: string;
|
|
29
|
+
/** How the install has to be run, which the printed command must match. */
|
|
30
|
+
readonly installOptions?: InstallOptions;
|
|
31
|
+
readonly installed: boolean;
|
|
32
|
+
readonly packageManager: PackageManager;
|
|
33
|
+
}
|
|
34
|
+
/** The exact commands to run next, adapted to what this run already did. */
|
|
35
|
+
export declare function describeNextSteps({ cwd, destination, installOptions, installed, packageManager, }: NextStepsOptions): readonly string[];
|
|
36
|
+
/**
|
|
37
|
+
* Creates a Next.js application with `create-next-app`, then adds Adjacent to
|
|
38
|
+
* it with the same code path `adj init` uses on an application that already
|
|
39
|
+
* exists.
|
|
40
|
+
*/
|
|
41
|
+
export declare function runCreate(options: CreateOptions, ports?: CreatePorts): Promise<CreateResult>;
|
|
42
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAK9B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,SAAS,MAAM,EAAE,CAkBnB;AAmBD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,WAAW,EACX,cAAc,EACd,SAAS,EACT,cAAc,GACf,EAAE,gBAAgB,GAAG,SAAS,MAAM,EAAE,CAatC;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,KAAK,GAAE,WAAgB,GACtB,OAAO,CAAC,YAAY,CAAC,CA+BvB"}
|
package/dist/create.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { relative, resolve } from "node:path";
|
|
2
|
+
import { assertDestinationUsable, resolveDestination } from "./destination.js";
|
|
3
|
+
import { runInit } from "./init.js";
|
|
4
|
+
import { resolvePackageManager, } from "./package-manager.js";
|
|
5
|
+
import { runInheritedCommand } from "./process.js";
|
|
6
|
+
import { deriveProjectIdentity } from "./project-name.js";
|
|
7
|
+
import { TERMINAL_REPORTER } from "./reporter.js";
|
|
8
|
+
/**
|
|
9
|
+
* Next.js owns what a current Next.js application looks like, so Adjacent does
|
|
10
|
+
* not carry a copy of one. These flags pick the shape Adjacent supports: the
|
|
11
|
+
* App Router, TypeScript, and Tailwind, which the starter shell is written in.
|
|
12
|
+
*/
|
|
13
|
+
export function createNextAppArguments(destination, manager) {
|
|
14
|
+
return [
|
|
15
|
+
destination,
|
|
16
|
+
"--app",
|
|
17
|
+
"--empty",
|
|
18
|
+
"--import-alias",
|
|
19
|
+
"@/*",
|
|
20
|
+
"--no-eslint",
|
|
21
|
+
"--no-src-dir",
|
|
22
|
+
"--tailwind",
|
|
23
|
+
"--typescript",
|
|
24
|
+
// Scaffold with whatever is installing here, so the project ends up with
|
|
25
|
+
// one lockfile rather than two.
|
|
26
|
+
manager.scaffoldFlag,
|
|
27
|
+
// Adjacent initialises no repository of its own, so neither does this.
|
|
28
|
+
"--disable-git",
|
|
29
|
+
"--yes",
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
async function scaffoldNextApp({ destination, }) {
|
|
33
|
+
const manager = await resolvePackageManager();
|
|
34
|
+
const { args, command } = manager.exec("create-next-app@latest", createNextAppArguments(destination, manager));
|
|
35
|
+
await runInheritedCommand(command, args).catch((error) => {
|
|
36
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
37
|
+
throw new Error(`Could not create the Next.js application at ${destination}: ${detail}`);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** The exact commands to run next, adapted to what this run already did. */
|
|
41
|
+
export function describeNextSteps({ cwd, destination, installOptions, installed, packageManager, }) {
|
|
42
|
+
const relativePath = relative(cwd, destination);
|
|
43
|
+
const target = relativePath === "" || relativePath.startsWith("..") ? destination : relativePath;
|
|
44
|
+
const install = packageManager.install(installOptions);
|
|
45
|
+
const dev = packageManager.run("dev");
|
|
46
|
+
return [
|
|
47
|
+
`cd ${target}`,
|
|
48
|
+
...(installed ? [] : [`${install.command} ${install.args.join(" ")}`]),
|
|
49
|
+
`${dev.command} ${dev.args.join(" ")}`,
|
|
50
|
+
"adj dev --android",
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Creates a Next.js application with `create-next-app`, then adds Adjacent to
|
|
55
|
+
* it with the same code path `adj init` uses on an application that already
|
|
56
|
+
* exists.
|
|
57
|
+
*/
|
|
58
|
+
export async function runCreate(options, ports = {}) {
|
|
59
|
+
const report = ports.reporter ?? TERMINAL_REPORTER;
|
|
60
|
+
const cwd = options.cwd ?? process.cwd();
|
|
61
|
+
const identity = deriveProjectIdentity(options.projectName);
|
|
62
|
+
const destination = resolveDestination(identity.packageName, options.directory, cwd);
|
|
63
|
+
report.intro("Adjacent project");
|
|
64
|
+
await assertDestinationUsable(destination);
|
|
65
|
+
report.step("Creating a Next.js application");
|
|
66
|
+
await (ports.createNextApp ?? scaffoldNextApp)({
|
|
67
|
+
destination,
|
|
68
|
+
projectName: identity.packageName,
|
|
69
|
+
});
|
|
70
|
+
const result = await runInit({ install: options.install, projectRoot: destination, scaffold: true }, { ...ports, reporter: report });
|
|
71
|
+
const steps = describeNextSteps({
|
|
72
|
+
cwd,
|
|
73
|
+
destination,
|
|
74
|
+
installOptions: result.installOptions,
|
|
75
|
+
installed: result.installed,
|
|
76
|
+
packageManager: result.packageManager,
|
|
77
|
+
});
|
|
78
|
+
report.step(`Next steps:\n${steps.map((command) => ` ${command}`).join("\n")}`);
|
|
79
|
+
report.outro(`${result.survey.identity.appName} is ready.`);
|
|
80
|
+
return { ...result, destination: resolve(destination) };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** Every Adjacent package a generated application depends on. */
|
|
2
|
+
export declare const ADJACENT_PACKAGES: readonly [{
|
|
3
|
+
readonly directory: "adjacent-core";
|
|
4
|
+
readonly name: "adjacent-core";
|
|
5
|
+
}, {
|
|
6
|
+
readonly directory: "adjacent-next";
|
|
7
|
+
readonly name: "adjacent-next";
|
|
8
|
+
}, {
|
|
9
|
+
readonly directory: "adjacent-react";
|
|
10
|
+
readonly name: "adjacent-react";
|
|
11
|
+
}, {
|
|
12
|
+
readonly directory: "adjacent-ui";
|
|
13
|
+
readonly name: "adjacent-ui";
|
|
14
|
+
}];
|
|
15
|
+
export declare const ADJACENT_VERSION: string;
|
|
16
|
+
export declare const PUBLISHED_ADJACENT_RANGE: string;
|
|
17
|
+
export declare const NEXT_VERSION = "^16.3.3";
|
|
18
|
+
export declare const REACT_VERSION = "^19.2.8";
|
|
19
|
+
export declare const TYPES_NODE_VERSION = "^20";
|
|
20
|
+
export declare const TYPES_REACT_VERSION = "^19";
|
|
21
|
+
export declare const TYPESCRIPT_VERSION = "^5";
|
|
22
|
+
export interface AdjacentDependencies {
|
|
23
|
+
readonly dependencies: Readonly<Record<string, string>>;
|
|
24
|
+
/** True when the packages resolve to a local checkout rather than the registry. */
|
|
25
|
+
readonly linked: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* True when the link is a `file:` path rather than a workspace membership.
|
|
28
|
+
* Bun's default linker copies such a dependency into place, and Turbopack
|
|
29
|
+
* cannot resolve the copy, so this asks for the isolated linker instead.
|
|
30
|
+
*/
|
|
31
|
+
readonly pathLinked: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Present only when linking. The Adjacent packages depend on each other
|
|
34
|
+
* through `workspace:*`, which cannot resolve outside the framework
|
|
35
|
+
* repository, so those transitive specifiers are overridden too.
|
|
36
|
+
*/
|
|
37
|
+
readonly overrides?: Readonly<Record<string, string>>;
|
|
38
|
+
}
|
|
39
|
+
export interface AdjacentDependencyOptions {
|
|
40
|
+
/** The framework's `packages/` directory. Absent means use the registry. */
|
|
41
|
+
readonly packagesRoot?: string;
|
|
42
|
+
/** Where the specifiers will be written, which decides whether they can be relative. */
|
|
43
|
+
readonly projectRoot?: string;
|
|
44
|
+
/** True when the project is a member of the framework's own Bun workspace. */
|
|
45
|
+
readonly workspaceMember?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Matches a path against a workspace glob such as `packages/*` or `apps/**`.
|
|
49
|
+
* Bun's globs are simple enough that a full matcher would be more machinery
|
|
50
|
+
* than the two shapes anyone writes.
|
|
51
|
+
*/
|
|
52
|
+
export declare function matchesWorkspaceGlob(path: string, glob: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Resolves how a generated application should depend on Adjacent. Passing the
|
|
55
|
+
* framework's `packages/` directory links against that checkout; passing
|
|
56
|
+
* nothing produces the published ranges.
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveAdjacentDependencies(options?: AdjacentDependencyOptions): AdjacentDependencies;
|
|
59
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../src/dependencies.ts"],"names":[],"mappings":"AAIA,iEAAiE;AACjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAKpB,CAAC;AAiBX,eAAO,MAAM,gBAAgB,EAAE,MAAyB,CAAC;AAEzD,eAAO,MAAM,wBAAwB,QAAyB,CAAC;AAE/D,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,yBAAyB;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CASxE;AA2DD;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,yBAA8B,GACtC,oBAAoB,CAgBtB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join, relative, sep } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/** Every Adjacent package a generated application depends on. */
|
|
5
|
+
export const ADJACENT_PACKAGES = [
|
|
6
|
+
{ directory: "adjacent-core", name: "adjacent-core" },
|
|
7
|
+
{ directory: "adjacent-next", name: "adjacent-next" },
|
|
8
|
+
{ directory: "adjacent-react", name: "adjacent-react" },
|
|
9
|
+
{ directory: "adjacent-ui", name: "adjacent-ui" },
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* The Adjacent packages are versioned and published together, so a generated
|
|
13
|
+
* application asks for the same version as the CLI that generated it. Reading
|
|
14
|
+
* it here rather than hardcoding a range means publishing needs no code change.
|
|
15
|
+
*/
|
|
16
|
+
function readOwnVersion() {
|
|
17
|
+
// Read rather than imported: a JSON import attribute is not supported across
|
|
18
|
+
// every Node version this CLI is meant to run on.
|
|
19
|
+
const manifest = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
|
|
20
|
+
const { version } = JSON.parse(readFileSync(manifest, "utf8"));
|
|
21
|
+
return version;
|
|
22
|
+
}
|
|
23
|
+
export const ADJACENT_VERSION = readOwnVersion();
|
|
24
|
+
export const PUBLISHED_ADJACENT_RANGE = `^${ADJACENT_VERSION}`;
|
|
25
|
+
export const NEXT_VERSION = "^16.3.3";
|
|
26
|
+
export const REACT_VERSION = "^19.2.8";
|
|
27
|
+
export const TYPES_NODE_VERSION = "^20";
|
|
28
|
+
export const TYPES_REACT_VERSION = "^19";
|
|
29
|
+
export const TYPESCRIPT_VERSION = "^5";
|
|
30
|
+
/**
|
|
31
|
+
* Matches a path against a workspace glob such as `packages/*` or `apps/**`.
|
|
32
|
+
* Bun's globs are simple enough that a full matcher would be more machinery
|
|
33
|
+
* than the two shapes anyone writes.
|
|
34
|
+
*/
|
|
35
|
+
export function matchesWorkspaceGlob(path, glob) {
|
|
36
|
+
const pattern = glob
|
|
37
|
+
.split("/")
|
|
38
|
+
.map((segment) => segment === "**" ? "[^\\0]*" : segment === "*" ? "[^/]+" : escapeSegment(segment))
|
|
39
|
+
.join("/");
|
|
40
|
+
return new RegExp(`^${pattern}$`).test(path);
|
|
41
|
+
}
|
|
42
|
+
function escapeSegment(segment) {
|
|
43
|
+
return segment.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
44
|
+
}
|
|
45
|
+
function workspaceSpecifiers() {
|
|
46
|
+
return Object.fromEntries(ADJACENT_PACKAGES.map(({ name }) => [name, "workspace:*"]));
|
|
47
|
+
}
|
|
48
|
+
/** package.json specifiers are POSIX paths on every platform. */
|
|
49
|
+
function toSpecifierPath(path) {
|
|
50
|
+
return path.split(sep).join("/");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A project inside the framework repository is linked relatively, so the
|
|
54
|
+
* checkout can be cloned or moved without every specifier breaking. A project
|
|
55
|
+
* anywhere else gets an absolute path, because a relative one would be a long
|
|
56
|
+
* climb that only holds while both stay exactly where they are.
|
|
57
|
+
*/
|
|
58
|
+
function linkedSpecifier(packagesRoot, directory, projectRoot) {
|
|
59
|
+
const target = join(packagesRoot, directory);
|
|
60
|
+
if (projectRoot === undefined)
|
|
61
|
+
return `file:${toSpecifierPath(target)}`;
|
|
62
|
+
const workspaceRoot = dirname(packagesRoot);
|
|
63
|
+
const fromWorkspace = relative(workspaceRoot, projectRoot);
|
|
64
|
+
const inCheckout = fromWorkspace !== "" &&
|
|
65
|
+
!fromWorkspace.startsWith("..") &&
|
|
66
|
+
!fromWorkspace.startsWith(sep);
|
|
67
|
+
return inCheckout
|
|
68
|
+
? `file:${toSpecifierPath(relative(projectRoot, target))}`
|
|
69
|
+
: `file:${toSpecifierPath(target)}`;
|
|
70
|
+
}
|
|
71
|
+
function linkedSpecifiers(packagesRoot, projectRoot) {
|
|
72
|
+
return Object.fromEntries(ADJACENT_PACKAGES.map(({ directory, name }) => [
|
|
73
|
+
name,
|
|
74
|
+
linkedSpecifier(packagesRoot, directory, projectRoot),
|
|
75
|
+
]));
|
|
76
|
+
}
|
|
77
|
+
function publishedSpecifiers() {
|
|
78
|
+
return Object.fromEntries(ADJACENT_PACKAGES.map(({ name }) => [name, PUBLISHED_ADJACENT_RANGE]));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolves how a generated application should depend on Adjacent. Passing the
|
|
82
|
+
* framework's `packages/` directory links against that checkout; passing
|
|
83
|
+
* nothing produces the published ranges.
|
|
84
|
+
*/
|
|
85
|
+
export function resolveAdjacentDependencies(options = {}) {
|
|
86
|
+
const { packagesRoot, projectRoot, workspaceMember } = options;
|
|
87
|
+
if (packagesRoot === undefined) {
|
|
88
|
+
return { dependencies: publishedSpecifiers(), linked: false, pathLinked: false };
|
|
89
|
+
}
|
|
90
|
+
// A member of the framework's own workspace is linked by Bun itself, which
|
|
91
|
+
// is the only form that survives a clean checkout: a `file:` link resolves a
|
|
92
|
+
// package's own dependencies from where it really lives, so it needs the
|
|
93
|
+
// framework's root install to have happened first.
|
|
94
|
+
if (workspaceMember) {
|
|
95
|
+
return { dependencies: workspaceSpecifiers(), linked: true, pathLinked: false };
|
|
96
|
+
}
|
|
97
|
+
const specifiers = linkedSpecifiers(packagesRoot, projectRoot);
|
|
98
|
+
return { dependencies: specifiers, linked: true, overrides: specifiers, pathLinked: true };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../src/dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project name is validated to be a single safe path segment, so the
|
|
3
|
+
* default destination cannot traverse. An explicit `--directory` is the user's
|
|
4
|
+
* own choice of location and is resolved against the working directory.
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveDestination(projectName: string, directory: string | undefined, cwd: string): string;
|
|
7
|
+
export interface DestinationState {
|
|
8
|
+
/** True when the directory was already there, so it must never be removed. */
|
|
9
|
+
readonly existed: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Refuses to write into anything that already holds files. An empty directory
|
|
13
|
+
* is accepted, which is what a user who ran `mkdir` first will have.
|
|
14
|
+
*/
|
|
15
|
+
export declare function assertDestinationUsable(destination: string): Promise<DestinationState>;
|
|
16
|
+
//# sourceMappingURL=destination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination.d.ts","sourceRoot":"","sources":["../src/destination.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,GACV,MAAM,CASR;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAoB3B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute, resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Entries that do not make a directory meaningfully occupied. A repository the
|
|
5
|
+
* user initialised before running the command should still be usable.
|
|
6
|
+
*/
|
|
7
|
+
const IGNORED_ENTRIES = new Set([".DS_Store", ".git"]);
|
|
8
|
+
/**
|
|
9
|
+
* The project name is validated to be a single safe path segment, so the
|
|
10
|
+
* default destination cannot traverse. An explicit `--directory` is the user's
|
|
11
|
+
* own choice of location and is resolved against the working directory.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveDestination(projectName, directory, cwd) {
|
|
14
|
+
if (directory === undefined)
|
|
15
|
+
return resolve(cwd, projectName);
|
|
16
|
+
const trimmed = directory.trim();
|
|
17
|
+
if (trimmed.length === 0) {
|
|
18
|
+
throw new Error("--directory needs a path, for example: --directory ./apps/my-app");
|
|
19
|
+
}
|
|
20
|
+
return isAbsolute(trimmed) ? resolve(trimmed) : resolve(cwd, trimmed);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Refuses to write into anything that already holds files. An empty directory
|
|
24
|
+
* is accepted, which is what a user who ran `mkdir` first will have.
|
|
25
|
+
*/
|
|
26
|
+
export async function assertDestinationUsable(destination) {
|
|
27
|
+
const entry = await stat(destination).catch(() => undefined);
|
|
28
|
+
if (!entry)
|
|
29
|
+
return { existed: false };
|
|
30
|
+
if (!entry.isDirectory()) {
|
|
31
|
+
throw new Error(`Cannot create a project at ${destination} because a file of that name already exists.`);
|
|
32
|
+
}
|
|
33
|
+
const contents = (await readdir(destination)).filter((name) => !IGNORED_ENTRIES.has(name));
|
|
34
|
+
if (contents.length > 0) {
|
|
35
|
+
throw new Error(`The directory ${destination} is not empty. Choose another name, pass --directory, or empty it first.`);
|
|
36
|
+
}
|
|
37
|
+
return { existed: true };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=destination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination.js","sourceRoot":"","sources":["../src/destination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD;;;GAGG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,SAA6B,EAC7B,GAAW;IAEX,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAOD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,8BAA8B,WAAW,8CAA8C,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAClD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CACrC,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,iBAAiB,WAAW,0EAA0E,CACvG,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Mirrors DEV_COMMAND in adjacent-core, which the CLI must not import. */
|
|
2
|
+
export declare const DEV_COMMAND: {
|
|
3
|
+
readonly clearCache: "ADJACENT_DEV_CLEAR_CACHE";
|
|
4
|
+
readonly navigate: "ADJACENT_DEV_NAVIGATE";
|
|
5
|
+
readonly reload: "ADJACENT_DEV_RELOAD";
|
|
6
|
+
};
|
|
7
|
+
export type DevCommand = {
|
|
8
|
+
readonly type: typeof DEV_COMMAND.clearCache;
|
|
9
|
+
} | {
|
|
10
|
+
readonly type: typeof DEV_COMMAND.reload;
|
|
11
|
+
} | {
|
|
12
|
+
readonly path: string;
|
|
13
|
+
readonly type: typeof DEV_COMMAND.navigate;
|
|
14
|
+
};
|
|
15
|
+
export interface DevChannel {
|
|
16
|
+
readonly clientCount: () => number;
|
|
17
|
+
readonly publish: (command: DevCommand) => number;
|
|
18
|
+
readonly stop: () => Promise<void>;
|
|
19
|
+
readonly url: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DevChannelState {
|
|
22
|
+
readonly channelUrl: string;
|
|
23
|
+
readonly origin: string;
|
|
24
|
+
readonly pid: number;
|
|
25
|
+
readonly port: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function parseDevCommand(value: unknown): DevCommand | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* The Next.js server proxies exactly `/_adjacent/dev` here, so subscribing is
|
|
30
|
+
* reachable from the device while `/publish` is not: publishing stays local to
|
|
31
|
+
* the machine running the CLI.
|
|
32
|
+
*/
|
|
33
|
+
export declare function startDevChannel(): Promise<DevChannel>;
|
|
34
|
+
export declare function stateFilePath(projectRoot: string): string;
|
|
35
|
+
export declare function writeDevChannelState(projectRoot: string, state: DevChannelState): Promise<void>;
|
|
36
|
+
export declare function clearDevChannelState(projectRoot: string): Promise<void>;
|
|
37
|
+
export declare function isRunning(pid: number): boolean;
|
|
38
|
+
export declare function readDevChannelState(projectRoot: string): Promise<DevChannelState>;
|
|
39
|
+
export declare function sendDevCommand(projectRoot: string, command: DevCommand): Promise<number>;
|
|
40
|
+
//# sourceMappingURL=dev-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-channel.d.ts","sourceRoot":"","sources":["../src/dev-channel.ts"],"names":[],"mappings":"AAIA,2EAA2E;AAC3E,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC,UAAU,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC,MAAM,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC,QAAQ,CAAA;CAAE,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,MAAM,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AA2CD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAqBtE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CA8E3D;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9C;AAED,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CA6B1B;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
/** Mirrors DEV_COMMAND in adjacent-core, which the CLI must not import. */
|
|
5
|
+
export const DEV_COMMAND = {
|
|
6
|
+
clearCache: "ADJACENT_DEV_CLEAR_CACHE",
|
|
7
|
+
navigate: "ADJACENT_DEV_NAVIGATE",
|
|
8
|
+
reload: "ADJACENT_DEV_RELOAD",
|
|
9
|
+
};
|
|
10
|
+
const HOLD_MILLISECONDS = 20_000;
|
|
11
|
+
const PUBLISH_PATH = "/publish";
|
|
12
|
+
const STATE_FILE = join(".adjacent", "dev.json");
|
|
13
|
+
function listen(server) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
server.once("error", reject);
|
|
16
|
+
server.listen(0, "127.0.0.1", () => {
|
|
17
|
+
const address = server.address();
|
|
18
|
+
if (!address || typeof address === "string") {
|
|
19
|
+
reject(new Error("Could not allocate the Adjacent development channel."));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
resolve(address.port);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function close(server) {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
server.close((error) => (error ? reject(error) : resolve()));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async function readBody(request) {
|
|
32
|
+
const chunks = [];
|
|
33
|
+
for await (const chunk of request) {
|
|
34
|
+
chunks.push(chunk);
|
|
35
|
+
if (chunks.reduce((total, part) => total + part.length, 0) > 8_192) {
|
|
36
|
+
throw new Error("The development command is too large.");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return JSON.parse(Buffer.concat(chunks).toString() || "null");
|
|
40
|
+
}
|
|
41
|
+
export function parseDevCommand(value) {
|
|
42
|
+
if (typeof value !== "object" || value === null)
|
|
43
|
+
return undefined;
|
|
44
|
+
const command = value;
|
|
45
|
+
if (command.type === DEV_COMMAND.reload)
|
|
46
|
+
return { type: DEV_COMMAND.reload };
|
|
47
|
+
if (command.type === DEV_COMMAND.clearCache) {
|
|
48
|
+
return { type: DEV_COMMAND.clearCache };
|
|
49
|
+
}
|
|
50
|
+
if (command.type === DEV_COMMAND.navigate) {
|
|
51
|
+
const { path } = command;
|
|
52
|
+
if (typeof path !== "string" ||
|
|
53
|
+
!path.startsWith("/") ||
|
|
54
|
+
path[1] === "/" ||
|
|
55
|
+
path[1] === "\\") {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
return { path, type: DEV_COMMAND.navigate };
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The Next.js server proxies exactly `/_adjacent/dev` here, so subscribing is
|
|
64
|
+
* reachable from the device while `/publish` is not: publishing stays local to
|
|
65
|
+
* the machine running the CLI.
|
|
66
|
+
*/
|
|
67
|
+
export async function startDevChannel() {
|
|
68
|
+
const waiters = new Set();
|
|
69
|
+
const server = createServer((request, response) => {
|
|
70
|
+
const path = (request.url ?? "/").split("?")[0];
|
|
71
|
+
if (request.method === "POST" && path === PUBLISH_PATH) {
|
|
72
|
+
void readBody(request)
|
|
73
|
+
.then((body) => {
|
|
74
|
+
const command = parseDevCommand(body);
|
|
75
|
+
if (!command) {
|
|
76
|
+
response.writeHead(400, { "content-type": "application/json" });
|
|
77
|
+
response.end(JSON.stringify({ error: "Unknown development command." }));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const clients = publish(command);
|
|
81
|
+
response.writeHead(200, { "content-type": "application/json" });
|
|
82
|
+
response.end(JSON.stringify({ clients, ok: true }));
|
|
83
|
+
})
|
|
84
|
+
.catch((error) => {
|
|
85
|
+
response.writeHead(400, { "content-type": "application/json" });
|
|
86
|
+
response.end(JSON.stringify({
|
|
87
|
+
error: error instanceof Error ? error.message : String(error),
|
|
88
|
+
}));
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (request.method !== "GET" || path !== "/") {
|
|
93
|
+
response.writeHead(404, { "content-type": "application/json" });
|
|
94
|
+
response.end(JSON.stringify({ error: "Not found" }));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const waiter = {
|
|
98
|
+
release(command) {
|
|
99
|
+
if (!waiters.delete(waiter))
|
|
100
|
+
return;
|
|
101
|
+
clearTimeout(timer);
|
|
102
|
+
if (!command) {
|
|
103
|
+
response.writeHead(204, { "cache-control": "no-store" });
|
|
104
|
+
response.end();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
response.writeHead(200, {
|
|
108
|
+
"cache-control": "no-store",
|
|
109
|
+
"content-type": "application/json",
|
|
110
|
+
});
|
|
111
|
+
response.end(JSON.stringify(command));
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
const timer = setTimeout(() => waiter.release(undefined), HOLD_MILLISECONDS);
|
|
115
|
+
request.once("close", () => {
|
|
116
|
+
if (!waiters.delete(waiter))
|
|
117
|
+
return;
|
|
118
|
+
clearTimeout(timer);
|
|
119
|
+
});
|
|
120
|
+
waiters.add(waiter);
|
|
121
|
+
});
|
|
122
|
+
function publish(command) {
|
|
123
|
+
const pending = [...waiters];
|
|
124
|
+
pending.forEach((waiter) => waiter.release(command));
|
|
125
|
+
return pending.length;
|
|
126
|
+
}
|
|
127
|
+
const port = await listen(server);
|
|
128
|
+
return {
|
|
129
|
+
clientCount: () => waiters.size,
|
|
130
|
+
publish,
|
|
131
|
+
async stop() {
|
|
132
|
+
[...waiters].forEach((waiter) => waiter.release(undefined));
|
|
133
|
+
await close(server);
|
|
134
|
+
},
|
|
135
|
+
url: `http://127.0.0.1:${port}`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export function stateFilePath(projectRoot) {
|
|
139
|
+
return join(projectRoot, STATE_FILE);
|
|
140
|
+
}
|
|
141
|
+
export async function writeDevChannelState(projectRoot, state) {
|
|
142
|
+
const path = stateFilePath(projectRoot);
|
|
143
|
+
await mkdir(join(projectRoot, ".adjacent"), { recursive: true });
|
|
144
|
+
await writeFile(path, `${JSON.stringify(state, null, 2)}\n`);
|
|
145
|
+
}
|
|
146
|
+
export async function clearDevChannelState(projectRoot) {
|
|
147
|
+
await rm(stateFilePath(projectRoot), { force: true });
|
|
148
|
+
}
|
|
149
|
+
export function isRunning(pid) {
|
|
150
|
+
try {
|
|
151
|
+
process.kill(pid, 0);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export async function readDevChannelState(projectRoot) {
|
|
159
|
+
const raw = await readFile(stateFilePath(projectRoot), "utf8").catch(() => undefined);
|
|
160
|
+
if (raw === undefined) {
|
|
161
|
+
throw new Error(`No Adjacent development server is running in ${projectRoot}. Start one with: adj dev --android`);
|
|
162
|
+
}
|
|
163
|
+
const state = JSON.parse(raw);
|
|
164
|
+
if (typeof state.channelUrl !== "string" ||
|
|
165
|
+
typeof state.origin !== "string" ||
|
|
166
|
+
typeof state.pid !== "number" ||
|
|
167
|
+
typeof state.port !== "number") {
|
|
168
|
+
throw new Error(`The Adjacent development state at ${stateFilePath(projectRoot)} is unreadable. Restart: adj dev --android`);
|
|
169
|
+
}
|
|
170
|
+
if (!isRunning(state.pid)) {
|
|
171
|
+
await clearDevChannelState(projectRoot);
|
|
172
|
+
throw new Error(`The Adjacent development server for ${projectRoot} is no longer running. Start one with: adj dev --android`);
|
|
173
|
+
}
|
|
174
|
+
return state;
|
|
175
|
+
}
|
|
176
|
+
export async function sendDevCommand(projectRoot, command) {
|
|
177
|
+
const state = await readDevChannelState(projectRoot);
|
|
178
|
+
const response = await fetch(`${state.channelUrl}${PUBLISH_PATH}`, {
|
|
179
|
+
body: JSON.stringify(command),
|
|
180
|
+
headers: { "content-type": "application/json" },
|
|
181
|
+
method: "POST",
|
|
182
|
+
}).catch(() => {
|
|
183
|
+
throw new Error(`Could not reach the Adjacent development server at ${state.channelUrl}.`);
|
|
184
|
+
});
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
const detail = (await response.json().catch(() => ({})));
|
|
187
|
+
throw new Error(detail.error ?? `The development server replied HTTP ${response.status}.`);
|
|
188
|
+
}
|
|
189
|
+
const { clients } = (await response.json());
|
|
190
|
+
return clients;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=dev-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-channel.js","sourceRoot":"","sources":["../src/dev-channel.ts"],"names":[],"mappings":"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"}
|
package/dist/dev.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnE,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|