@fluxfast/next 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/bin/fluxfast.js +2 -11
  2. package/dist/cli/apply.d.ts +11 -0
  3. package/dist/cli/apply.d.ts.map +1 -0
  4. package/dist/cli/apply.js +189 -0
  5. package/dist/cli/apply.js.map +1 -0
  6. package/dist/cli/diagnostics.d.ts +22 -0
  7. package/dist/cli/diagnostics.d.ts.map +1 -0
  8. package/dist/cli/diagnostics.js +180 -0
  9. package/dist/cli/diagnostics.js.map +1 -0
  10. package/dist/cli/files.d.ts +14 -0
  11. package/dist/cli/files.d.ts.map +1 -0
  12. package/dist/cli/files.js +60 -0
  13. package/dist/cli/files.js.map +1 -0
  14. package/dist/cli/index.d.ts +7 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +251 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/cli/init.d.ts +42 -0
  19. package/dist/cli/init.d.ts.map +1 -0
  20. package/dist/cli/init.js +158 -0
  21. package/dist/cli/init.js.map +1 -0
  22. package/dist/cli/migration.d.ts +11 -0
  23. package/dist/cli/migration.d.ts.map +1 -0
  24. package/dist/cli/migration.js +73 -0
  25. package/dist/cli/migration.js.map +1 -0
  26. package/dist/cli/next-config.d.ts +16 -0
  27. package/dist/cli/next-config.d.ts.map +1 -0
  28. package/dist/cli/next-config.js +258 -0
  29. package/dist/cli/next-config.js.map +1 -0
  30. package/dist/cli/project.d.ts +12 -0
  31. package/dist/cli/project.d.ts.map +1 -0
  32. package/dist/cli/project.js +320 -0
  33. package/dist/cli/project.js.map +1 -0
  34. package/dist/cli/types.d.ts +41 -0
  35. package/dist/cli/types.d.ts.map +1 -0
  36. package/dist/cli/types.js +3 -0
  37. package/dist/cli/types.js.map +1 -0
  38. package/dist/generate.d.ts +10 -0
  39. package/dist/generate.d.ts.map +1 -1
  40. package/dist/generate.js +29 -8
  41. package/dist/generate.js.map +1 -1
  42. package/package.json +2 -2
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runCli = runCli;
4
+ const generate_1 = require("../generate");
5
+ const apply_1 = require("./apply");
6
+ const diagnostics_1 = require("./diagnostics");
7
+ const init_1 = require("./init");
8
+ const project_1 = require("./project");
9
+ const defaultIo = {
10
+ cwd: process.cwd(),
11
+ stdout: message => console.log(message),
12
+ stderr: message => console.error(message),
13
+ };
14
+ const USAGE = `Usage:
15
+ fluxfast init [--dry-run] [--yes] [--force]
16
+ fluxfast init --check
17
+ fluxfast generate
18
+ fluxfast doctor
19
+ fluxfast --help`;
20
+ function displayPath(plan, target) {
21
+ return (0, init_1.relativeProjectPath)(plan.project, target).replace(/\\/g, "/");
22
+ }
23
+ function writePlanWarnings(plan, io) {
24
+ for (const warning of plan.warnings) {
25
+ io.stdout(`! ${warning}`);
26
+ }
27
+ if (plan.manualActions.length > 0) {
28
+ io.stdout("\nManual action required:\n");
29
+ for (const action of plan.manualActions) {
30
+ io.stdout(` ${action}`);
31
+ }
32
+ }
33
+ }
34
+ function groupOperations(operations) {
35
+ const grouped = new Map();
36
+ for (const operation of operations) {
37
+ const existing = grouped.get(operation.type) ?? [];
38
+ existing.push(operation);
39
+ grouped.set(operation.type, existing);
40
+ }
41
+ return grouped;
42
+ }
43
+ function renderDryRun(plan, io) {
44
+ io.stdout("FluxFast Setup — Dry Run\n");
45
+ const grouped = groupOperations((0, init_1.changedOperations)(plan));
46
+ const labels = [
47
+ ["mkdir", "Would create directory:"],
48
+ ["create", "Would create:"],
49
+ ["modify", "Would modify:"],
50
+ ["move", "Would move:"],
51
+ ["remove", "Would remove:"],
52
+ ];
53
+ for (const [type, label] of labels) {
54
+ const operations = grouped.get(type);
55
+ if (!operations?.length)
56
+ continue;
57
+ io.stdout(label);
58
+ for (const operation of operations) {
59
+ if (operation.type === "move") {
60
+ io.stdout(` ${displayPath(plan, operation.from)}\n → ${displayPath(plan, operation.to)}`);
61
+ }
62
+ else if (operation.type !== "skip") {
63
+ io.stdout(` ${displayPath(plan, operation.path)}`);
64
+ }
65
+ }
66
+ io.stdout("");
67
+ }
68
+ writePlanWarnings(plan, io);
69
+ io.stdout("\nNo files were changed.");
70
+ }
71
+ function renderAppliedPlan(plan, io) {
72
+ for (const operation of (0, init_1.changedOperations)(plan)) {
73
+ if (operation.type === "mkdir") {
74
+ io.stdout(`✓ Created ${displayPath(plan, operation.path)}/`);
75
+ }
76
+ else if (operation.type === "create") {
77
+ io.stdout(`✓ Created ${displayPath(plan, operation.path)}`);
78
+ }
79
+ else if (operation.type === "modify") {
80
+ io.stdout(`✓ Updated ${displayPath(plan, operation.path)}`);
81
+ }
82
+ else if (operation.type === "move") {
83
+ io.stdout(`✓ Moved ${displayPath(plan, operation.from)} → ${displayPath(plan, operation.to)}`);
84
+ }
85
+ else if (operation.type === "remove") {
86
+ io.stdout(`✓ Removed ${displayPath(plan, operation.path)}`);
87
+ }
88
+ }
89
+ }
90
+ function diagnosticLine(item) {
91
+ const symbol = item.status === "pass" ? "✓" : item.status === "warning" ? "!" : "✗";
92
+ return `${symbol} ${item.message}`;
93
+ }
94
+ function uniqueFixes(report) {
95
+ return [
96
+ ...new Set(report.diagnostics
97
+ .filter(item => item.status === "fail" || item.blocksCheck)
98
+ .map(item => item.fix)
99
+ .filter((fix) => Boolean(fix))),
100
+ ];
101
+ }
102
+ function renderFixes(report, io) {
103
+ const fixes = uniqueFixes(report);
104
+ if (fixes.length === 0)
105
+ return;
106
+ io.stdout("\nFix:\n");
107
+ for (const fix of fixes) {
108
+ io.stdout(` ${fix}`);
109
+ }
110
+ }
111
+ function runCheck(io) {
112
+ const project = (0, project_1.detectFluxProject)(io.cwd);
113
+ const report = (0, diagnostics_1.validateFluxProject)(project);
114
+ io.stdout("FluxFast Configuration Check\n");
115
+ for (const item of report.diagnostics) {
116
+ io.stdout(diagnosticLine(item));
117
+ }
118
+ if (report.valid) {
119
+ io.stdout("\nFluxFast is configured correctly.");
120
+ return 0;
121
+ }
122
+ renderFixes(report, io);
123
+ io.stdout("\nFluxFast configuration is incomplete.");
124
+ return 1;
125
+ }
126
+ function runInit(args, io) {
127
+ const supportedOptions = new Set(["--dry-run", "--yes", "--check", "--force"]);
128
+ const unknown = args.find(argument => !supportedOptions.has(argument));
129
+ if (unknown) {
130
+ io.stderr(`Unknown option: ${unknown}\n\n${USAGE}`);
131
+ return 2;
132
+ }
133
+ if (args.includes("--check")) {
134
+ if (args.length !== 1) {
135
+ io.stderr(`--check cannot be combined with other init options.\n\n${USAGE}`);
136
+ return 2;
137
+ }
138
+ return runCheck(io);
139
+ }
140
+ const project = (0, project_1.detectFluxProject)(io.cwd);
141
+ const plan = (0, init_1.createInitPlan)(project, { force: args.includes("--force") });
142
+ if (plan.errors.length > 0) {
143
+ io.stderr("FluxFast Setup\n");
144
+ for (const error of plan.errors) {
145
+ io.stderr(`✗ ${error}`);
146
+ }
147
+ return 1;
148
+ }
149
+ if (args.includes("--dry-run")) {
150
+ renderDryRun(plan, io);
151
+ return plan.manualActions.length > 0 ? 1 : 0;
152
+ }
153
+ io.stdout("FluxFast Setup\n");
154
+ const result = (0, apply_1.applyInitPlan)(plan, { logRegistry: false });
155
+ if (result.changed === 0) {
156
+ io.stdout("✓ No scaffold changes required.");
157
+ }
158
+ else {
159
+ renderAppliedPlan(plan, io);
160
+ }
161
+ io.stdout(`✓ Generated FluxFast registry at ${displayPath(plan, result.registryPath)}`);
162
+ writePlanWarnings(plan, io);
163
+ if (plan.manualActions.length > 0) {
164
+ return 1;
165
+ }
166
+ io.stdout("\nReady.");
167
+ return 0;
168
+ }
169
+ const DOCTOR_SECTIONS = [
170
+ "Environment",
171
+ "Packages",
172
+ "Project",
173
+ "Configuration",
174
+ "Pages",
175
+ "Registry",
176
+ ];
177
+ function runDoctor(args, io) {
178
+ if (args.length > 0) {
179
+ io.stderr(`Unknown option: ${args[0]}\n\n${USAGE}`);
180
+ return 2;
181
+ }
182
+ const project = (0, project_1.detectFluxProject)(io.cwd);
183
+ const report = (0, diagnostics_1.validateFluxProject)(project);
184
+ io.stdout("FluxFast Doctor");
185
+ for (const section of DOCTOR_SECTIONS) {
186
+ const items = report.diagnostics.filter(item => item.section === section);
187
+ if (items.length === 0)
188
+ continue;
189
+ io.stdout(`\n${section}`);
190
+ for (const item of items) {
191
+ io.stdout(` ${diagnosticLine(item)}`);
192
+ }
193
+ if (section === "Pages") {
194
+ for (const page of report.pages) {
195
+ io.stdout(` ✓ ${page}`);
196
+ }
197
+ }
198
+ }
199
+ renderFixes(report, io);
200
+ const hasWarnings = report.diagnostics.some(item => item.status === "warning");
201
+ if (report.valid && !hasWarnings) {
202
+ io.stdout("\nNo problems found.");
203
+ }
204
+ else if (report.valid) {
205
+ io.stdout("\nNo blocking problems found.");
206
+ }
207
+ else {
208
+ io.stdout("\nFluxFast found configuration problems.");
209
+ }
210
+ return report.valid ? 0 : 1;
211
+ }
212
+ function runGenerate(args, io) {
213
+ if (args.length > 0) {
214
+ io.stderr(`Unknown option: ${args[0]}\n\n${USAGE}`);
215
+ return 2;
216
+ }
217
+ const project = (0, project_1.detectFluxProject)(io.cwd);
218
+ (0, generate_1.generatePagesRegistry)({
219
+ pagesDir: project.fluxPagesDir,
220
+ outputFile: project.registryPath,
221
+ log: false,
222
+ });
223
+ io.stdout(`✓ Generated FluxFast registry at ${(0, init_1.relativeProjectPath)(project, project.registryPath).replace(/\\/g, "/")}`);
224
+ return 0;
225
+ }
226
+ function runCli(args, io = defaultIo) {
227
+ const [command, ...commandArgs] = args;
228
+ try {
229
+ if (!command || command === "--help" || command === "-h") {
230
+ io.stdout(USAGE);
231
+ return 0;
232
+ }
233
+ if (command === "init") {
234
+ return runInit(commandArgs, io);
235
+ }
236
+ if (command === "generate") {
237
+ return runGenerate(commandArgs, io);
238
+ }
239
+ if (command === "doctor") {
240
+ return runDoctor(commandArgs, io);
241
+ }
242
+ io.stderr(`Unknown command: ${command}\n\n${USAGE}`);
243
+ return 2;
244
+ }
245
+ catch (error) {
246
+ const message = error instanceof Error ? error.message : String(error);
247
+ io.stderr(`✗ ${message}`);
248
+ return 1;
249
+ }
250
+ }
251
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { FluxProjectInfo } from "./types";
2
+ export type InitOperation = {
3
+ type: "mkdir";
4
+ path: string;
5
+ } | {
6
+ type: "create";
7
+ path: string;
8
+ content: string;
9
+ } | {
10
+ type: "modify";
11
+ path: string;
12
+ before: string;
13
+ after: string;
14
+ } | {
15
+ type: "move";
16
+ from: string;
17
+ to: string;
18
+ before: string;
19
+ content: string;
20
+ } | {
21
+ type: "remove";
22
+ path: string;
23
+ } | {
24
+ type: "skip";
25
+ path?: string;
26
+ reason: string;
27
+ };
28
+ export interface InitPlan {
29
+ project: FluxProjectInfo;
30
+ operations: InitOperation[];
31
+ warnings: string[];
32
+ errors: string[];
33
+ manualActions: string[];
34
+ }
35
+ export interface InitPlanOptions {
36
+ force?: boolean;
37
+ }
38
+ /** Create a deterministic, read-only plan for FluxFast-owned scaffolding. */
39
+ export declare function createInitPlan(project: FluxProjectInfo, options?: InitPlanOptions): InitPlan;
40
+ export declare function changedOperations(plan: InitPlan): InitOperation[];
41
+ export declare function relativeProjectPath(project: FluxProjectInfo, target: string): string;
42
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAkBD,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CAqIV;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,EAAE,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpF"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createInitPlan = createInitPlan;
7
+ exports.changedOperations = changedOperations;
8
+ exports.relativeProjectPath = relativeProjectPath;
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const diagnostics_1 = require("./diagnostics");
12
+ const files_1 = require("./files");
13
+ const migration_1 = require("./migration");
14
+ const next_config_1 = require("./next-config");
15
+ function isFile(filePath) {
16
+ try {
17
+ return node_fs_1.default.statSync(filePath).isFile();
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function isDirectory(directoryPath) {
24
+ try {
25
+ return node_fs_1.default.statSync(directoryPath).isDirectory();
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ /** Create a deterministic, read-only plan for FluxFast-owned scaffolding. */
32
+ function createInitPlan(project, options = {}) {
33
+ const operations = [];
34
+ const warnings = [];
35
+ const errors = [];
36
+ const manualActions = [];
37
+ errors.push(...(0, diagnostics_1.validateInitPrerequisites)(project)
38
+ .filter(item => item.status === "fail" || item.blocksCheck)
39
+ .map(item => item.message));
40
+ if (errors.length > 0) {
41
+ return { project, operations, warnings, errors, manualActions };
42
+ }
43
+ if (!isDirectory(project.fluxPagesDir)) {
44
+ operations.push({ type: "mkdir", path: project.fluxPagesDir });
45
+ }
46
+ if (isFile(project.configPath)) {
47
+ operations.push({
48
+ type: "skip",
49
+ path: project.configPath,
50
+ reason: "FluxFast config already exists",
51
+ });
52
+ }
53
+ else {
54
+ operations.push({
55
+ type: "create",
56
+ path: project.configPath,
57
+ content: (0, files_1.renderFluxConfig)(project),
58
+ });
59
+ }
60
+ const catchAllPath = (0, files_1.desiredCatchAllPath)(project);
61
+ if (isFile(catchAllPath)) {
62
+ const before = node_fs_1.default.readFileSync(catchAllPath, "utf8");
63
+ const after = (0, files_1.renderCatchAll)(project);
64
+ if (before === after || ((0, files_1.isFluxCatchAll)(before) && !options.force)) {
65
+ operations.push({
66
+ type: "skip",
67
+ path: catchAllPath,
68
+ reason: "FluxFast catch-all already exists",
69
+ });
70
+ }
71
+ else if (options.force) {
72
+ operations.push({
73
+ type: "modify",
74
+ path: catchAllPath,
75
+ before,
76
+ after,
77
+ });
78
+ warnings.push(`${relativeProjectPath(project, catchAllPath)} was replaced because --force was used.`);
79
+ }
80
+ else {
81
+ const displayPath = relativeProjectPath(project, catchAllPath);
82
+ const warning = `${displayPath} exists but is not a valid FluxFast catch-all.`;
83
+ warnings.push(warning);
84
+ manualActions.push(`Repair ${displayPath} manually or run npx fluxfast init --force.`);
85
+ operations.push({ type: "skip", path: catchAllPath, reason: warning });
86
+ }
87
+ }
88
+ else {
89
+ operations.push({
90
+ type: "create",
91
+ path: catchAllPath,
92
+ content: (0, files_1.renderCatchAll)(project),
93
+ });
94
+ }
95
+ const homePagePath = (0, files_1.desiredHomePagePath)(project);
96
+ if (project.rootPagePath) {
97
+ if (isFile(homePagePath)) {
98
+ const warning = `${project.rootPagePath} remains in place because ${homePagePath} already exists.`;
99
+ warnings.push(warning);
100
+ manualActions.push(`Remove or migrate ${project.rootPagePath}; it shadows the FluxFast route "/".`);
101
+ operations.push({ type: "skip", path: project.rootPagePath, reason: warning });
102
+ }
103
+ else {
104
+ const original = node_fs_1.default.readFileSync(project.rootPagePath, "utf8");
105
+ const inspection = (0, migration_1.inspectPage)(original);
106
+ if (inspection.safety === "default-page") {
107
+ operations.push({
108
+ type: "move",
109
+ from: project.rootPagePath,
110
+ to: homePagePath,
111
+ before: original,
112
+ content: (0, migration_1.prepareMigratedPage)(original, project.rootPagePath, homePagePath),
113
+ });
114
+ }
115
+ else {
116
+ const warning = inspection.safety === "server-only"
117
+ ? `${project.rootPagePath} uses Server Component APIs and was not selected for migration.`
118
+ : `${project.rootPagePath} appears custom and was not selected for migration.`;
119
+ warnings.push(warning);
120
+ manualActions.push(`Create or migrate the FluxFast home page at ${homePagePath}, then remove ${project.rootPagePath}.`);
121
+ operations.push({
122
+ type: "skip",
123
+ path: project.rootPagePath,
124
+ reason: `${warning} ${inspection.reasons.join(", ")}`,
125
+ });
126
+ }
127
+ }
128
+ }
129
+ else if (isFile(homePagePath)) {
130
+ operations.push({
131
+ type: "skip",
132
+ path: homePagePath,
133
+ reason: "FluxFast home page already exists",
134
+ });
135
+ }
136
+ else {
137
+ operations.push({
138
+ type: "create",
139
+ path: homePagePath,
140
+ content: (0, files_1.renderStarterPage)(),
141
+ });
142
+ }
143
+ const nextConfig = (0, next_config_1.planNextConfigIntegration)(project);
144
+ if (nextConfig.operation) {
145
+ operations.push(nextConfig.operation);
146
+ }
147
+ if (nextConfig.manualAction) {
148
+ manualActions.push(nextConfig.manualAction);
149
+ }
150
+ return { project, operations, warnings, errors, manualActions };
151
+ }
152
+ function changedOperations(plan) {
153
+ return plan.operations.filter(operation => operation.type !== "skip");
154
+ }
155
+ function relativeProjectPath(project, target) {
156
+ return node_path_1.default.relative(project.root, target) || ".";
157
+ }
158
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":";;;;;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAC7B,+CAA0D;AAC1D,mCAOiB;AACjB,2CAA+D;AAC/D,+CAA0D;AAuB1D,SAAS,MAAM,CAAC,QAAgB;IAC9B,IAAI,CAAC;QACH,OAAO,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,aAAqB;IACxC,IAAI,CAAC;QACH,OAAO,iBAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,wBACE,OAAwB,EACxB,OAAO,GAAoB,EAAE;IAE7B,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,CAAC,IAAI,CACT,GAAG,IAAA,uCAAyB,EAAC,OAAO,CAAC;SAClC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC;SAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAC7B,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,OAAO,CAAC,UAAU;YACxB,MAAM,EAAE,gCAAgC;SACzC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO,CAAC,UAAU;YACxB,OAAO,EAAE,IAAA,wBAAgB,EAAC,OAAO,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,IAAA,2BAAmB,EAAC,OAAO,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,iBAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAA,sBAAc,EAAC,OAAO,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,IAAA,sBAAc,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,mCAAmC;aAC5C,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,YAAY;gBAClB,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CACX,GAAG,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,yCAAyC,CACvF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,GAAG,WAAW,gDAAgD,CAAC;YAC/E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,aAAa,CAAC,IAAI,CAChB,UAAU,WAAW,6CAA6C,CACnE,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,IAAA,sBAAc,EAAC,OAAO,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,IAAA,2BAAmB,EAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,YAAY,6BAA6B,YAAY,kBAAkB,CAAC;YACnG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,aAAa,CAAC,IAAI,CAChB,qBAAqB,OAAO,CAAC,YAAY,sCAAsC,CAChF,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,iBAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,IAAA,uBAAW,EAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,UAAU,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO,CAAC,YAAY;oBAC1B,EAAE,EAAE,YAAY;oBAChB,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,IAAA,+BAAmB,EAC1B,QAAQ,EACR,OAAO,CAAC,YAAY,EACpB,YAAY,CACb;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,KAAK,aAAa;oBACjC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,iEAAiE;oBAC1F,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,qDAAqD,CAAC;gBACnF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,aAAa,CAAC,IAAI,CAChB,+CAA+C,YAAY,iBAAiB,OAAO,CAAC,YAAY,GAAG,CACpG,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO,CAAC,YAAY;oBAC1B,MAAM,EAAE,GAAG,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,mCAAmC;SAC5C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,IAAA,yBAAiB,GAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,uCAAyB,EAAC,OAAO,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5B,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAClE,CAAC;AAED,2BAAkC,IAAc;IAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,6BAAoC,OAAwB,EAAE,MAAc;IAC1E,OAAO,mBAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC;AACpD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type PageSafety = "default-page" | "custom-page" | "server-only";
2
+ export interface PageInspection {
3
+ safety: PageSafety;
4
+ reasons: string[];
5
+ }
6
+ export declare function inspectPage(content: string): PageInspection;
7
+ export declare function ensureUseClient(content: string): string;
8
+ /** Preserve relative static imports when a page moves to flux-pages. */
9
+ export declare function rewriteRelativeImports(content: string, fromFile: string, toFile: string): string;
10
+ export declare function prepareMigratedPage(content: string, fromFile: string, toFile: string): string;
11
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/cli/migration.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;AAcxE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAyB3D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKvD;AAWD,wEAAwE;AACxE,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAsBR;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAER"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.inspectPage = inspectPage;
7
+ exports.ensureUseClient = ensureUseClient;
8
+ exports.rewriteRelativeImports = rewriteRelativeImports;
9
+ exports.prepareMigratedPage = prepareMigratedPage;
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const SERVER_ONLY_PATTERNS = [
12
+ [/\bfrom\s+["']next\/headers["']/, "imports next/headers"],
13
+ [/\b(?:import\s+)?["']server-only["']/, "imports server-only"],
14
+ [/\bfrom\s+["'](?:node:)?fs(?:\/promises)?["']/, "imports Node fs"],
15
+ [/\bfrom\s+["']node:path["']/, "imports Node path"],
16
+ [/\b(?:cookies|headers|draftMode)\s*\(/, "uses a server request API"],
17
+ [/["']use server["'];?/, "contains a Server Action directive"],
18
+ [/\bexport\s+(?:const\s+metadata|async\s+function\s+generateMetadata|function\s+generateMetadata|async\s+function\s+generateViewport|function\s+generateViewport)\b/, "exports server-only route metadata"],
19
+ [/\bexport\s+default\s+async\b|\basync\s+function\s+[A-Za-z_$][\w$]*\s*\(/, "contains an async component or loader"],
20
+ [/\bprocess\.env\.(?!NEXT_PUBLIC_)[A-Za-z_$][\w$]*/, "reads a server environment variable"],
21
+ ];
22
+ function inspectPage(content) {
23
+ const serverReasons = SERVER_ONLY_PATTERNS.filter(([pattern]) => pattern.test(content)).map(([, reason]) => reason);
24
+ if (serverReasons.length > 0) {
25
+ return { safety: "server-only", reasons: serverReasons };
26
+ }
27
+ const defaultSignals = [
28
+ /\bfrom\s+["']next\/image["']/,
29
+ /page\.module\.css/,
30
+ /(?:next|vercel)\.svg/,
31
+ /Get started by editing|Create Next App|Deploy Now/,
32
+ ].filter(pattern => pattern.test(content)).length;
33
+ if (defaultSignals >= 2) {
34
+ return {
35
+ safety: "default-page",
36
+ reasons: ["matches the standard create-next-app starter"],
37
+ };
38
+ }
39
+ return {
40
+ safety: "custom-page",
41
+ reasons: ["does not match a known generated starter"],
42
+ };
43
+ }
44
+ function ensureUseClient(content) {
45
+ if (/^\uFEFF?\s*["']use client["'];/.test(content)) {
46
+ return content;
47
+ }
48
+ return `"use client";\n\n${content.replace(/^\uFEFF/, "")}`;
49
+ }
50
+ function portableRelativeImport(fromFile, targetPath) {
51
+ const relative = node_path_1.default
52
+ .relative(node_path_1.default.dirname(fromFile), targetPath)
53
+ .replace(/\\/g, "/");
54
+ return relative.startsWith("./") || relative.startsWith("../")
55
+ ? relative
56
+ : `./${relative}`;
57
+ }
58
+ /** Preserve relative static imports when a page moves to flux-pages. */
59
+ function rewriteRelativeImports(content, fromFile, toFile) {
60
+ const rewrite = (specifier) => {
61
+ if (!specifier.startsWith(".")) {
62
+ return specifier;
63
+ }
64
+ return portableRelativeImport(toFile, node_path_1.default.resolve(node_path_1.default.dirname(fromFile), specifier));
65
+ };
66
+ return content
67
+ .replace(/(\b(?:import|export)\s+(?:[^"']*?\s+from\s+)?["'])(\.{1,2}\/[^"']+)(["'])/g, (_match, prefix, specifier, suffix) => `${prefix}${rewrite(specifier)}${suffix}`)
68
+ .replace(/(\bimport\s*\(\s*["'])(\.{1,2}\/[^"']+)(["']\s*\))/g, (_match, prefix, specifier, suffix) => `${prefix}${rewrite(specifier)}${suffix}`);
69
+ }
70
+ function prepareMigratedPage(content, fromFile, toFile) {
71
+ return ensureUseClient(rewriteRelativeImports(content, fromFile, toFile));
72
+ }
73
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/cli/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { InitOperation } from "./init";
2
+ import type { FluxProjectInfo, NextConfigFormat } from "./types";
3
+ export interface NextConfigTransform {
4
+ status: "modified" | "unchanged" | "manual";
5
+ content: string;
6
+ reason?: string;
7
+ }
8
+ export interface NextConfigPlanResult {
9
+ operation?: InitOperation;
10
+ manualAction?: string;
11
+ }
12
+ export declare function transformNextConfig(content: string, format: NextConfigFormat): NextConfigTransform;
13
+ export declare function desiredNextConfigPath(project: FluxProjectInfo): string;
14
+ export declare function renderNextConfig(project: FluxProjectInfo): string;
15
+ export declare function planNextConfigIntegration(project: FluxProjectInfo): NextConfigPlanResult;
16
+ //# sourceMappingURL=next-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-config.d.ts","sourceRoot":"","sources":["../../src/cli/next-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA+JD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,GACvB,mBAAmB,CAqCrB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAKtE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAOjE;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,eAAe,GACvB,oBAAoB,CAwCtB"}