@amplifyup/sdk 0.1.78 → 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.
- package/README.md +91 -28
- package/dist/AmplifyRenderer-BNWBrFQN.d.ts +47 -0
- package/dist/AmplifyRenderer-CPUr9Bkc.d.mts +47 -0
- package/dist/AmplifyRenderer.d.mts +4 -40
- package/dist/AmplifyRenderer.d.ts +4 -40
- package/dist/AmplifyRenderer.js +106 -14
- package/dist/AmplifyRenderer.js.map +1 -1
- package/dist/AmplifyRenderer.mjs +106 -14
- package/dist/AmplifyRenderer.mjs.map +1 -1
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +266 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +260 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/config.d.mts +18 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/config.mjs +8 -0
- package/dist/config.mjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/next.d.mts +9 -0
- package/dist/next.d.ts +9 -0
- package/dist/next.js +259 -0
- package/dist/next.js.map +1 -0
- package/dist/next.mjs +253 -0
- package/dist/next.mjs.map +1 -0
- package/dist/query-DYjs4LQQ.d.mts +262 -0
- package/dist/query-Xo9cy-2F.d.ts +262 -0
- package/dist/react.d.mts +19 -21
- package/dist/react.d.ts +19 -21
- package/dist/react.js +1141 -1035
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +1140 -1035
- package/dist/react.mjs.map +1 -1
- package/dist/server.d.mts +3 -3
- package/dist/server.d.ts +3 -3
- package/dist/{types-D4TSd2Yt.d.mts → types-ffQNIQCK.d.mts} +1 -102
- package/dist/{types-D4TSd2Yt.d.ts → types-ffQNIQCK.d.ts} +1 -102
- package/package.json +17 -2
- package/dist/query-B23UsNIv.d.ts +0 -161
- package/dist/query-CV8x3oQT.d.mts +0 -161
package/dist/next.d.mts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type NextConfigObject = Record<string, unknown>;
|
|
2
|
+
type NextConfigContext = {
|
|
3
|
+
defaultConfig: NextConfigObject;
|
|
4
|
+
};
|
|
5
|
+
type NextConfigFunction = (phase: string, context: NextConfigContext) => NextConfigObject | Promise<NextConfigObject>;
|
|
6
|
+
type NextConfigInput = NextConfigObject | NextConfigFunction;
|
|
7
|
+
declare const withAmplifyUp: (nextConfig?: NextConfigInput) => NextConfigFunction;
|
|
8
|
+
|
|
9
|
+
export { withAmplifyUp };
|
package/dist/next.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type NextConfigObject = Record<string, unknown>;
|
|
2
|
+
type NextConfigContext = {
|
|
3
|
+
defaultConfig: NextConfigObject;
|
|
4
|
+
};
|
|
5
|
+
type NextConfigFunction = (phase: string, context: NextConfigContext) => NextConfigObject | Promise<NextConfigObject>;
|
|
6
|
+
type NextConfigInput = NextConfigObject | NextConfigFunction;
|
|
7
|
+
declare const withAmplifyUp: (nextConfig?: NextConfigInput) => NextConfigFunction;
|
|
8
|
+
|
|
9
|
+
export { withAmplifyUp };
|
package/dist/next.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs');
|
|
4
|
+
var path2 = require('path');
|
|
5
|
+
var jiti = require('jiti');
|
|
6
|
+
var tinyglobby = require('tinyglobby');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var path2__default = /*#__PURE__*/_interopDefault(path2);
|
|
11
|
+
|
|
12
|
+
/* @amplifyup/sdk - https://amplifyup.ai */
|
|
13
|
+
|
|
14
|
+
var CONFIG_FILES = [
|
|
15
|
+
"amplifyup.config.ts",
|
|
16
|
+
"amplifyup.config.mts",
|
|
17
|
+
"amplifyup.config.mjs",
|
|
18
|
+
"amplifyup.config.js",
|
|
19
|
+
"amplifyup.config.cjs"
|
|
20
|
+
];
|
|
21
|
+
var findConfigFile = (cwd) => CONFIG_FILES.map((name) => path2__default.default.join(cwd, name)).find((file) => fs.existsSync(file));
|
|
22
|
+
var defaultRoots = (cwd) => fs.existsSync(path2__default.default.join(cwd, "src")) ? ["src/components"] : ["components"];
|
|
23
|
+
var defaultOutput = (firstRoot) => path2__default.default.join(path2__default.default.dirname(firstRoot), ".amplifyup", "component-registry");
|
|
24
|
+
var outputExtension = (cwd) => fs.existsSync(path2__default.default.join(cwd, "tsconfig.json")) ? ".tsx" : ".jsx";
|
|
25
|
+
var loadComponentsConfig = async (cwd) => {
|
|
26
|
+
const configFile = findConfigFile(cwd);
|
|
27
|
+
let config = {};
|
|
28
|
+
if (configFile) {
|
|
29
|
+
const jiti$1 = jiti.createJiti(path2__default.default.join(cwd, "amplifyup.config.loader"));
|
|
30
|
+
config = await jiti$1.import(configFile, { default: true }) ?? {};
|
|
31
|
+
}
|
|
32
|
+
const components = config.components ?? {};
|
|
33
|
+
const roots = components.roots?.length ? components.roots : defaultRoots(cwd);
|
|
34
|
+
const output = components.output ?? defaultOutput(roots[0]);
|
|
35
|
+
return {
|
|
36
|
+
cwd,
|
|
37
|
+
roots: roots.map((root) => path2__default.default.resolve(cwd, root)),
|
|
38
|
+
exclude: components.exclude ?? [],
|
|
39
|
+
outputFile: path2__default.default.resolve(cwd, output) + outputExtension(cwd),
|
|
40
|
+
configFile
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// src/component-key.ts
|
|
45
|
+
var componentKey = (id) => id.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
46
|
+
|
|
47
|
+
// src/cli/scan-components.ts
|
|
48
|
+
var ALWAYS_EXCLUDE = [
|
|
49
|
+
"**/*.test.*",
|
|
50
|
+
"**/*.spec.*",
|
|
51
|
+
"**/*.stories.*",
|
|
52
|
+
"**/*.d.ts",
|
|
53
|
+
"**/__tests__/**",
|
|
54
|
+
"**/__mocks__/**"
|
|
55
|
+
];
|
|
56
|
+
var ComponentRegistryError = class extends Error {
|
|
57
|
+
constructor(message) {
|
|
58
|
+
super(message);
|
|
59
|
+
this.name = "ComponentRegistryError";
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var NAMED_DECLARATION = /export\s+(?:declare\s+)?(?:async\s+)?(?:const|let|var|function\*?|class)\s+([A-Za-z_$][\w$]*)/g;
|
|
63
|
+
var EXPORT_LIST = /export\s*\{([^}]*)\}/g;
|
|
64
|
+
var readExports = (source) => {
|
|
65
|
+
const named = [];
|
|
66
|
+
let hasDefault = /export\s+default\b/.test(source);
|
|
67
|
+
for (const match of source.matchAll(NAMED_DECLARATION)) {
|
|
68
|
+
named.push(match[1]);
|
|
69
|
+
}
|
|
70
|
+
for (const match of source.matchAll(EXPORT_LIST)) {
|
|
71
|
+
for (const part of match[1].split(",")) {
|
|
72
|
+
const spec = part.trim();
|
|
73
|
+
if (!spec || spec.startsWith("type ")) continue;
|
|
74
|
+
const exported = spec.split(/\s+as\s+/).pop().trim();
|
|
75
|
+
if (exported === "default") {
|
|
76
|
+
hasDefault = true;
|
|
77
|
+
} else {
|
|
78
|
+
named.push(exported);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { hasDefault, named };
|
|
83
|
+
};
|
|
84
|
+
var entryName = (file, root) => {
|
|
85
|
+
const base = path2__default.default.basename(file, path2__default.default.extname(file));
|
|
86
|
+
if (base !== "index") return base;
|
|
87
|
+
const dir = path2__default.default.dirname(file);
|
|
88
|
+
return dir === root ? null : path2__default.default.basename(dir);
|
|
89
|
+
};
|
|
90
|
+
var isIndexPair = (a, b) => path2__default.default.dirname(a.file) === path2__default.default.dirname(b.file) && [a, b].some((entry) => path2__default.default.basename(entry.file).startsWith("index."));
|
|
91
|
+
var toEntry = (file, root) => {
|
|
92
|
+
const name = entryName(file, root);
|
|
93
|
+
if (!name) return null;
|
|
94
|
+
const key = componentKey(name);
|
|
95
|
+
const { hasDefault, named } = readExports(fs.readFileSync(file, "utf8"));
|
|
96
|
+
const exportName = hasDefault ? "default" : named.find((exported) => componentKey(exported) === key);
|
|
97
|
+
if (!exportName) {
|
|
98
|
+
return {
|
|
99
|
+
file,
|
|
100
|
+
reason: `no default export or export named "${name}"`
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return { name, key, file, exportName };
|
|
104
|
+
};
|
|
105
|
+
var scanComponents = async (config) => {
|
|
106
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
107
|
+
const skipped = [];
|
|
108
|
+
const missingRoots = [];
|
|
109
|
+
for (const root of config.roots) {
|
|
110
|
+
if (!fs.existsSync(root)) {
|
|
111
|
+
missingRoots.push(root);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const files = await tinyglobby.glob(["**/*.{tsx,jsx,js}"], {
|
|
115
|
+
cwd: root,
|
|
116
|
+
ignore: [...ALWAYS_EXCLUDE, ...config.exclude],
|
|
117
|
+
absolute: true
|
|
118
|
+
});
|
|
119
|
+
for (const file of files.map((f) => path2__default.default.resolve(f)).sort()) {
|
|
120
|
+
const result = toEntry(file, root);
|
|
121
|
+
if (!result) continue;
|
|
122
|
+
if (!("key" in result)) {
|
|
123
|
+
skipped.push(result);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const existing = byKey.get(result.key);
|
|
127
|
+
if (!existing) {
|
|
128
|
+
byKey.set(result.key, result);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (isIndexPair(existing, result)) {
|
|
132
|
+
const keepResult = path2__default.default.basename(result.file).startsWith("index.");
|
|
133
|
+
if (keepResult) byKey.set(result.key, result);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
throw new ComponentRegistryError(
|
|
137
|
+
`Two components resolve to the same name "${result.name}":
|
|
138
|
+
${path2__default.default.relative(config.cwd, existing.file)}
|
|
139
|
+
${path2__default.default.relative(config.cwd, result.file)}
|
|
140
|
+
Rename one of them, or add it to components.exclude in amplifyup.config.ts.`
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const entries = [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
145
|
+
return { entries, skipped, missingRoots };
|
|
146
|
+
};
|
|
147
|
+
var importPath = (fromFile, toFile) => {
|
|
148
|
+
const withoutExt = toFile.slice(0, toFile.length - path2__default.default.extname(toFile).length);
|
|
149
|
+
const relative = path2__default.default.relative(path2__default.default.dirname(fromFile), withoutExt).split(path2__default.default.sep).join("/").replace(/\/index$/, "");
|
|
150
|
+
return relative.startsWith(".") ? relative : `./${relative}`;
|
|
151
|
+
};
|
|
152
|
+
var importLine = (entry, local, outputFile) => {
|
|
153
|
+
const from = JSON.stringify(importPath(outputFile, entry.file));
|
|
154
|
+
return entry.exportName === "default" ? `import ${local} from ${from};` : `import { ${entry.exportName} as ${local} } from ${from};`;
|
|
155
|
+
};
|
|
156
|
+
var renderRegistrySource = (entries, outputFile) => {
|
|
157
|
+
const imports = entries.map((entry, i) => importLine(entry, `C${i}`, outputFile));
|
|
158
|
+
const members = entries.map((entry, i) => ` ${JSON.stringify(entry.name)}: C${i},`);
|
|
159
|
+
return [
|
|
160
|
+
"'use client';",
|
|
161
|
+
"",
|
|
162
|
+
"// Generated by Amplify UP from your components folder. Do not edit \u2014",
|
|
163
|
+
"// add, rename or delete component files instead.",
|
|
164
|
+
"",
|
|
165
|
+
"import { defineComponentRegistry, bindAmplifyPage } from '@amplifyup/sdk/react';",
|
|
166
|
+
...imports,
|
|
167
|
+
"",
|
|
168
|
+
"export const componentRegistry = defineComponentRegistry({",
|
|
169
|
+
...members,
|
|
170
|
+
"});",
|
|
171
|
+
"",
|
|
172
|
+
"export const AmplifyPage = bindAmplifyPage(componentRegistry);",
|
|
173
|
+
""
|
|
174
|
+
].join("\n");
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// src/cli/build-registry.ts
|
|
178
|
+
var LOG_PREFIX = "[Amplify UP]";
|
|
179
|
+
var WATCH_DEBOUNCE_MS = 120;
|
|
180
|
+
var writeIfChanged = (file, content) => {
|
|
181
|
+
if (fs.existsSync(file) && fs.readFileSync(file, "utf8") === content) return false;
|
|
182
|
+
fs.mkdirSync(path2__default.default.dirname(file), { recursive: true });
|
|
183
|
+
fs.writeFileSync(file, content);
|
|
184
|
+
return true;
|
|
185
|
+
};
|
|
186
|
+
var ensureSelfIgnored = (outputFile) => {
|
|
187
|
+
const dir = path2__default.default.dirname(outputFile);
|
|
188
|
+
if (path2__default.default.basename(dir) !== ".amplifyup") return;
|
|
189
|
+
writeIfChanged(path2__default.default.join(dir, ".gitignore"), "*\n");
|
|
190
|
+
};
|
|
191
|
+
var buildRegistryFromConfig = async (config) => {
|
|
192
|
+
const scan = await scanComponents(config);
|
|
193
|
+
const source = renderRegistrySource(scan.entries, config.outputFile);
|
|
194
|
+
const changed = writeIfChanged(config.outputFile, source);
|
|
195
|
+
ensureSelfIgnored(config.outputFile);
|
|
196
|
+
return { ...scan, outputFile: config.outputFile, changed };
|
|
197
|
+
};
|
|
198
|
+
var buildRegistry = async (cwd) => buildRegistryFromConfig(await loadComponentsConfig(cwd));
|
|
199
|
+
var reportRegistry = (result, cwd) => {
|
|
200
|
+
const rel = (file) => path2__default.default.relative(cwd, file) || ".";
|
|
201
|
+
for (const root of result.missingRoots) {
|
|
202
|
+
console.warn(`${LOG_PREFIX} Components folder not found: ${rel(root)}`);
|
|
203
|
+
}
|
|
204
|
+
for (const skip of result.skipped) {
|
|
205
|
+
console.warn(`${LOG_PREFIX} Skipped ${rel(skip.file)}: ${skip.reason}`);
|
|
206
|
+
}
|
|
207
|
+
console.log(
|
|
208
|
+
`${LOG_PREFIX} Component registry: ${result.entries.length} component(s) \u2192 ${rel(result.outputFile)}`
|
|
209
|
+
);
|
|
210
|
+
};
|
|
211
|
+
var watchRegistry = async (cwd) => {
|
|
212
|
+
const config = await loadComponentsConfig(cwd);
|
|
213
|
+
const watchers = [];
|
|
214
|
+
let timer;
|
|
215
|
+
const rebuild = () => {
|
|
216
|
+
clearTimeout(timer);
|
|
217
|
+
timer = setTimeout(() => {
|
|
218
|
+
buildRegistryFromConfig(config).then((result) => {
|
|
219
|
+
if (result.changed) reportRegistry(result, cwd);
|
|
220
|
+
}).catch((error) => {
|
|
221
|
+
console.error(`${LOG_PREFIX} Component registry update failed:`, error);
|
|
222
|
+
});
|
|
223
|
+
}, WATCH_DEBOUNCE_MS);
|
|
224
|
+
};
|
|
225
|
+
for (const root of config.roots.filter((r) => fs.existsSync(r))) {
|
|
226
|
+
watchers.push(fs.watch(root, { recursive: true }, rebuild));
|
|
227
|
+
}
|
|
228
|
+
return () => {
|
|
229
|
+
clearTimeout(timer);
|
|
230
|
+
watchers.forEach((watcher) => watcher.close());
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// src/next.ts
|
|
235
|
+
var DEV_PHASE = "phase-development-server";
|
|
236
|
+
var STATE_KEY = Symbol.for("amplifyup.registryBuild");
|
|
237
|
+
var registryState = () => {
|
|
238
|
+
const store = globalThis;
|
|
239
|
+
store[STATE_KEY] ?? (store[STATE_KEY] = {});
|
|
240
|
+
return store[STATE_KEY];
|
|
241
|
+
};
|
|
242
|
+
var prepareRegistry = async (phase) => {
|
|
243
|
+
const cwd = process.cwd();
|
|
244
|
+
const state = registryState();
|
|
245
|
+
state.built ?? (state.built = buildRegistry(cwd).then((result) => reportRegistry(result, cwd)));
|
|
246
|
+
await state.built;
|
|
247
|
+
if (phase === DEV_PHASE && !state.watching) {
|
|
248
|
+
state.watching = true;
|
|
249
|
+
await watchRegistry(cwd);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
var withAmplifyUp = (nextConfig = {}) => async (phase, context) => {
|
|
253
|
+
await prepareRegistry(phase);
|
|
254
|
+
return typeof nextConfig === "function" ? nextConfig(phase, context) : nextConfig;
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
exports.withAmplifyUp = withAmplifyUp;
|
|
258
|
+
//# sourceMappingURL=next.js.map
|
|
259
|
+
//# sourceMappingURL=next.js.map
|
package/dist/next.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/load-config.ts","../src/component-key.ts","../src/cli/scan-components.ts","../src/cli/render-registry.ts","../src/cli/build-registry.ts","../src/next.ts"],"names":["path","existsSync","jiti","createJiti","readFileSync","glob","mkdirSync","writeFileSync","watch"],"mappings":"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","file":"next.js","sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport { createJiti } from 'jiti';\nimport type { AmplifyConfig } from '../config';\n\nconst CONFIG_FILES = [\n 'amplifyup.config.ts',\n 'amplifyup.config.mts',\n 'amplifyup.config.mjs',\n 'amplifyup.config.js',\n 'amplifyup.config.cjs',\n];\n\nexport type ResolvedComponentsConfig = {\n cwd: string;\n /** Absolute component folders. */\n roots: string[];\n exclude: string[];\n /** Absolute generated file path, extension included. */\n outputFile: string;\n /** Config file that was loaded, if any. */\n configFile?: string;\n};\n\nconst findConfigFile = (cwd: string): string | undefined =>\n CONFIG_FILES.map((name) => path.join(cwd, name)).find((file) => existsSync(file));\n\nconst defaultRoots = (cwd: string): string[] =>\n existsSync(path.join(cwd, 'src')) ? ['src/components'] : ['components'];\n\nconst defaultOutput = (firstRoot: string): string =>\n path.join(path.dirname(firstRoot), '.amplifyup', 'component-registry');\n\n/** TS projects get `.tsx`; plain JS projects get `.jsx` so Next doesn't switch them to TypeScript. */\nconst outputExtension = (cwd: string): string =>\n existsSync(path.join(cwd, 'tsconfig.json')) ? '.tsx' : '.jsx';\n\nexport const loadComponentsConfig = async (\n cwd: string\n): Promise<ResolvedComponentsConfig> => {\n const configFile = findConfigFile(cwd);\n let config: AmplifyConfig = {};\n\n if (configFile) {\n const jiti = createJiti(path.join(cwd, 'amplifyup.config.loader'));\n config = (await jiti.import<AmplifyConfig>(configFile, { default: true })) ?? {};\n }\n\n const components = config.components ?? {};\n const roots = components.roots?.length ? components.roots : defaultRoots(cwd);\n const output = components.output ?? defaultOutput(roots[0]);\n\n return {\n cwd,\n roots: roots.map((root) => path.resolve(cwd, root)),\n exclude: components.exclude ?? [],\n outputFile: path.resolve(cwd, output) + outputExtension(cwd),\n configFile,\n };\n};\n","/**\n * One matching rule for layout component IDs and component file names, so\n * `Hero`, `hero`, `HERO` and `e2e-hero` / `E2eHero` resolve to the same entry.\n */\nexport const componentKey = (id: string): string =>\n id.toLowerCase().replace(/[^a-z0-9]/g, '');\n","import { existsSync, readFileSync } from 'fs';\nimport path from 'path';\nimport { glob } from 'tinyglobby';\nimport { componentKey } from '../component-key';\nimport type { ResolvedComponentsConfig } from './load-config';\n\nconst ALWAYS_EXCLUDE = [\n '**/*.test.*',\n '**/*.spec.*',\n '**/*.stories.*',\n '**/*.d.ts',\n '**/__tests__/**',\n '**/__mocks__/**',\n];\n\nexport type RegistryEntry = {\n /** Registry name — the file (or folder, for `index` files) name. */\n name: string;\n key: string;\n /** Absolute file path. */\n file: string;\n /** `default`, or the named export that is the component. */\n exportName: string;\n};\n\nexport type SkippedFile = {\n file: string;\n reason: string;\n};\n\nexport type ScanResult = {\n entries: RegistryEntry[];\n skipped: SkippedFile[];\n missingRoots: string[];\n};\n\nexport class ComponentRegistryError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ComponentRegistryError';\n }\n}\n\nconst NAMED_DECLARATION =\n /export\\s+(?:declare\\s+)?(?:async\\s+)?(?:const|let|var|function\\*?|class)\\s+([A-Za-z_$][\\w$]*)/g;\n\nconst EXPORT_LIST = /export\\s*\\{([^}]*)\\}/g;\n\n/** Export names a file declares, read from source (no type checking needed). */\nconst readExports = (source: string): { hasDefault: boolean; named: string[] } => {\n const named: string[] = [];\n let hasDefault = /export\\s+default\\b/.test(source);\n\n for (const match of source.matchAll(NAMED_DECLARATION)) {\n named.push(match[1]);\n }\n\n for (const match of source.matchAll(EXPORT_LIST)) {\n for (const part of match[1].split(',')) {\n const spec = part.trim();\n if (!spec || spec.startsWith('type ')) continue;\n\n const exported = spec.split(/\\s+as\\s+/).pop()!.trim();\n if (exported === 'default') {\n hasDefault = true;\n } else {\n named.push(exported);\n }\n }\n }\n\n return { hasDefault, named };\n};\n\nconst entryName = (file: string, root: string): string | null => {\n const base = path.basename(file, path.extname(file));\n if (base !== 'index') return base;\n\n // `components/index.tsx` is a barrel, not a component.\n const dir = path.dirname(file);\n return dir === root ? null : path.basename(dir);\n};\n\n/** `Hero/index.tsx` and `Hero/Hero.tsx` describe one component — keep the index. */\nconst isIndexPair = (a: RegistryEntry, b: RegistryEntry): boolean =>\n path.dirname(a.file) === path.dirname(b.file) &&\n [a, b].some((entry) => path.basename(entry.file).startsWith('index.'));\n\nconst toEntry = (\n file: string,\n root: string\n): RegistryEntry | SkippedFile | null => {\n const name = entryName(file, root);\n if (!name) return null;\n\n const key = componentKey(name);\n const { hasDefault, named } = readExports(readFileSync(file, 'utf8'));\n const exportName = hasDefault\n ? 'default'\n : named.find((exported) => componentKey(exported) === key);\n\n if (!exportName) {\n return {\n file,\n reason: `no default export or export named \"${name}\"`,\n };\n }\n\n return { name, key, file, exportName };\n};\n\nexport const scanComponents = async (\n config: ResolvedComponentsConfig\n): Promise<ScanResult> => {\n const byKey = new Map<string, RegistryEntry>();\n const skipped: SkippedFile[] = [];\n const missingRoots: string[] = [];\n\n for (const root of config.roots) {\n if (!existsSync(root)) {\n missingRoots.push(root);\n continue;\n }\n\n const files = await glob(['**/*.{tsx,jsx,js}'], {\n cwd: root,\n ignore: [...ALWAYS_EXCLUDE, ...config.exclude],\n absolute: true,\n });\n\n for (const file of files.map((f) => path.resolve(f)).sort()) {\n const result = toEntry(file, root);\n if (!result) continue;\n\n if (!('key' in result)) {\n skipped.push(result);\n continue;\n }\n\n const existing = byKey.get(result.key);\n if (!existing) {\n byKey.set(result.key, result);\n continue;\n }\n\n if (isIndexPair(existing, result)) {\n const keepResult = path.basename(result.file).startsWith('index.');\n if (keepResult) byKey.set(result.key, result);\n continue;\n }\n\n throw new ComponentRegistryError(\n `Two components resolve to the same name \"${result.name}\":\\n` +\n ` ${path.relative(config.cwd, existing.file)}\\n` +\n ` ${path.relative(config.cwd, result.file)}\\n` +\n 'Rename one of them, or add it to components.exclude in amplifyup.config.ts.'\n );\n }\n }\n\n const entries = [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));\n return { entries, skipped, missingRoots };\n};\n","import path from 'path';\nimport type { RegistryEntry } from './scan-components';\n\nconst importPath = (fromFile: string, toFile: string): string => {\n const withoutExt = toFile.slice(0, toFile.length - path.extname(toFile).length);\n const relative = path\n .relative(path.dirname(fromFile), withoutExt)\n .split(path.sep)\n .join('/')\n .replace(/\\/index$/, '');\n return relative.startsWith('.') ? relative : `./${relative}`;\n};\n\nconst importLine = (entry: RegistryEntry, local: string, outputFile: string): string => {\n const from = JSON.stringify(importPath(outputFile, entry.file));\n return entry.exportName === 'default'\n ? `import ${local} from ${from};`\n : `import { ${entry.exportName} as ${local} } from ${from};`;\n};\n\n/** Source of the generated component registry module. Stable for unchanged input. */\nexport const renderRegistrySource = (\n entries: RegistryEntry[],\n outputFile: string\n): string => {\n const imports = entries.map((entry, i) => importLine(entry, `C${i}`, outputFile));\n const members = entries.map((entry, i) => ` ${JSON.stringify(entry.name)}: C${i},`);\n\n return [\n \"'use client';\",\n '',\n '// Generated by Amplify UP from your components folder. Do not edit —',\n '// add, rename or delete component files instead.',\n '',\n \"import { defineComponentRegistry, bindAmplifyPage } from '@amplifyup/sdk/react';\",\n ...imports,\n '',\n 'export const componentRegistry = defineComponentRegistry({',\n ...members,\n '});',\n '',\n 'export const AmplifyPage = bindAmplifyPage(componentRegistry);',\n '',\n ].join('\\n');\n};\n","import { existsSync, mkdirSync, readFileSync, watch, writeFileSync, type FSWatcher } from 'fs';\nimport path from 'path';\nimport { loadComponentsConfig, type ResolvedComponentsConfig } from './load-config';\nimport { scanComponents, type ScanResult } from './scan-components';\nimport { renderRegistrySource } from './render-registry';\n\nconst LOG_PREFIX = '[Amplify UP]';\nconst WATCH_DEBOUNCE_MS = 120;\n\nexport type BuildRegistryResult = ScanResult & {\n outputFile: string;\n /** False when the file already had this content (no rewrite, no HMR churn). */\n changed: boolean;\n};\n\nconst writeIfChanged = (file: string, content: string): boolean => {\n if (existsSync(file) && readFileSync(file, 'utf8') === content) return false;\n\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, content);\n return true;\n};\n\n/** The generated folder ignores itself, so sites never commit it. */\nconst ensureSelfIgnored = (outputFile: string): void => {\n const dir = path.dirname(outputFile);\n if (path.basename(dir) !== '.amplifyup') return;\n writeIfChanged(path.join(dir, '.gitignore'), '*\\n');\n};\n\nexport const buildRegistryFromConfig = async (\n config: ResolvedComponentsConfig\n): Promise<BuildRegistryResult> => {\n const scan = await scanComponents(config);\n const source = renderRegistrySource(scan.entries, config.outputFile);\n\n const changed = writeIfChanged(config.outputFile, source);\n ensureSelfIgnored(config.outputFile);\n\n return { ...scan, outputFile: config.outputFile, changed };\n};\n\nexport const buildRegistry = async (cwd: string): Promise<BuildRegistryResult> =>\n buildRegistryFromConfig(await loadComponentsConfig(cwd));\n\nexport const reportRegistry = (result: BuildRegistryResult, cwd: string): void => {\n const rel = (file: string) => path.relative(cwd, file) || '.';\n\n for (const root of result.missingRoots) {\n console.warn(`${LOG_PREFIX} Components folder not found: ${rel(root)}`);\n }\n\n for (const skip of result.skipped) {\n console.warn(`${LOG_PREFIX} Skipped ${rel(skip.file)}: ${skip.reason}`);\n }\n\n console.log(\n `${LOG_PREFIX} Component registry: ${result.entries.length} component(s) → ${rel(result.outputFile)}`\n );\n};\n\n/** Regenerates on add/remove/rename. Returns a function that stops watching. */\nexport const watchRegistry = async (cwd: string): Promise<() => void> => {\n const config = await loadComponentsConfig(cwd);\n const watchers: FSWatcher[] = [];\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const rebuild = () => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n buildRegistryFromConfig(config)\n .then((result) => {\n if (result.changed) reportRegistry(result, cwd);\n })\n .catch((error: unknown) => {\n console.error(`${LOG_PREFIX} Component registry update failed:`, error);\n });\n }, WATCH_DEBOUNCE_MS);\n };\n\n for (const root of config.roots.filter((r) => existsSync(r))) {\n watchers.push(watch(root, { recursive: true }, rebuild));\n }\n\n return () => {\n clearTimeout(timer);\n watchers.forEach((watcher) => watcher.close());\n };\n};\n","/**\n * `withAmplifyUp(nextConfig)` — builds the component registry whenever Next\n * loads its config (`next build`, `next dev`) and keeps it current during dev.\n */\nimport { buildRegistry, reportRegistry, watchRegistry } from './cli/build-registry';\n\ntype NextConfigObject = Record<string, unknown>;\n\ntype NextConfigContext = {\n defaultConfig: NextConfigObject;\n};\n\ntype NextConfigFunction = (\n phase: string,\n context: NextConfigContext\n) => NextConfigObject | Promise<NextConfigObject>;\n\ntype NextConfigInput = NextConfigObject | NextConfigFunction;\n\nconst DEV_PHASE = 'phase-development-server';\n\ntype RegistryState = {\n built?: Promise<void>;\n watching?: boolean;\n};\n\n// Next loads its config more than once per process; build and watch only once.\nconst STATE_KEY = Symbol.for('amplifyup.registryBuild');\n\nconst registryState = (): RegistryState => {\n const store = globalThis as typeof globalThis & { [STATE_KEY]?: RegistryState };\n store[STATE_KEY] ??= {};\n return store[STATE_KEY]!;\n};\n\nconst prepareRegistry = async (phase: string): Promise<void> => {\n const cwd = process.cwd();\n const state = registryState();\n\n state.built ??= buildRegistry(cwd).then((result) => reportRegistry(result, cwd));\n await state.built;\n\n if (phase === DEV_PHASE && !state.watching) {\n state.watching = true;\n await watchRegistry(cwd);\n }\n};\n\nexport const withAmplifyUp = (nextConfig: NextConfigInput = {}): NextConfigFunction =>\n async (phase, context) => {\n await prepareRegistry(phase);\n return typeof nextConfig === 'function' ? nextConfig(phase, context) : nextConfig;\n };\n"]}
|
package/dist/next.mjs
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { existsSync, watch, readFileSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
|
+
import path2 from 'path';
|
|
3
|
+
import { createJiti } from 'jiti';
|
|
4
|
+
import { glob } from 'tinyglobby';
|
|
5
|
+
|
|
6
|
+
/* @amplifyup/sdk - https://amplifyup.ai */
|
|
7
|
+
|
|
8
|
+
var CONFIG_FILES = [
|
|
9
|
+
"amplifyup.config.ts",
|
|
10
|
+
"amplifyup.config.mts",
|
|
11
|
+
"amplifyup.config.mjs",
|
|
12
|
+
"amplifyup.config.js",
|
|
13
|
+
"amplifyup.config.cjs"
|
|
14
|
+
];
|
|
15
|
+
var findConfigFile = (cwd) => CONFIG_FILES.map((name) => path2.join(cwd, name)).find((file) => existsSync(file));
|
|
16
|
+
var defaultRoots = (cwd) => existsSync(path2.join(cwd, "src")) ? ["src/components"] : ["components"];
|
|
17
|
+
var defaultOutput = (firstRoot) => path2.join(path2.dirname(firstRoot), ".amplifyup", "component-registry");
|
|
18
|
+
var outputExtension = (cwd) => existsSync(path2.join(cwd, "tsconfig.json")) ? ".tsx" : ".jsx";
|
|
19
|
+
var loadComponentsConfig = async (cwd) => {
|
|
20
|
+
const configFile = findConfigFile(cwd);
|
|
21
|
+
let config = {};
|
|
22
|
+
if (configFile) {
|
|
23
|
+
const jiti = createJiti(path2.join(cwd, "amplifyup.config.loader"));
|
|
24
|
+
config = await jiti.import(configFile, { default: true }) ?? {};
|
|
25
|
+
}
|
|
26
|
+
const components = config.components ?? {};
|
|
27
|
+
const roots = components.roots?.length ? components.roots : defaultRoots(cwd);
|
|
28
|
+
const output = components.output ?? defaultOutput(roots[0]);
|
|
29
|
+
return {
|
|
30
|
+
cwd,
|
|
31
|
+
roots: roots.map((root) => path2.resolve(cwd, root)),
|
|
32
|
+
exclude: components.exclude ?? [],
|
|
33
|
+
outputFile: path2.resolve(cwd, output) + outputExtension(cwd),
|
|
34
|
+
configFile
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// src/component-key.ts
|
|
39
|
+
var componentKey = (id) => id.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
40
|
+
|
|
41
|
+
// src/cli/scan-components.ts
|
|
42
|
+
var ALWAYS_EXCLUDE = [
|
|
43
|
+
"**/*.test.*",
|
|
44
|
+
"**/*.spec.*",
|
|
45
|
+
"**/*.stories.*",
|
|
46
|
+
"**/*.d.ts",
|
|
47
|
+
"**/__tests__/**",
|
|
48
|
+
"**/__mocks__/**"
|
|
49
|
+
];
|
|
50
|
+
var ComponentRegistryError = class extends Error {
|
|
51
|
+
constructor(message) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.name = "ComponentRegistryError";
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
var NAMED_DECLARATION = /export\s+(?:declare\s+)?(?:async\s+)?(?:const|let|var|function\*?|class)\s+([A-Za-z_$][\w$]*)/g;
|
|
57
|
+
var EXPORT_LIST = /export\s*\{([^}]*)\}/g;
|
|
58
|
+
var readExports = (source) => {
|
|
59
|
+
const named = [];
|
|
60
|
+
let hasDefault = /export\s+default\b/.test(source);
|
|
61
|
+
for (const match of source.matchAll(NAMED_DECLARATION)) {
|
|
62
|
+
named.push(match[1]);
|
|
63
|
+
}
|
|
64
|
+
for (const match of source.matchAll(EXPORT_LIST)) {
|
|
65
|
+
for (const part of match[1].split(",")) {
|
|
66
|
+
const spec = part.trim();
|
|
67
|
+
if (!spec || spec.startsWith("type ")) continue;
|
|
68
|
+
const exported = spec.split(/\s+as\s+/).pop().trim();
|
|
69
|
+
if (exported === "default") {
|
|
70
|
+
hasDefault = true;
|
|
71
|
+
} else {
|
|
72
|
+
named.push(exported);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { hasDefault, named };
|
|
77
|
+
};
|
|
78
|
+
var entryName = (file, root) => {
|
|
79
|
+
const base = path2.basename(file, path2.extname(file));
|
|
80
|
+
if (base !== "index") return base;
|
|
81
|
+
const dir = path2.dirname(file);
|
|
82
|
+
return dir === root ? null : path2.basename(dir);
|
|
83
|
+
};
|
|
84
|
+
var isIndexPair = (a, b) => path2.dirname(a.file) === path2.dirname(b.file) && [a, b].some((entry) => path2.basename(entry.file).startsWith("index."));
|
|
85
|
+
var toEntry = (file, root) => {
|
|
86
|
+
const name = entryName(file, root);
|
|
87
|
+
if (!name) return null;
|
|
88
|
+
const key = componentKey(name);
|
|
89
|
+
const { hasDefault, named } = readExports(readFileSync(file, "utf8"));
|
|
90
|
+
const exportName = hasDefault ? "default" : named.find((exported) => componentKey(exported) === key);
|
|
91
|
+
if (!exportName) {
|
|
92
|
+
return {
|
|
93
|
+
file,
|
|
94
|
+
reason: `no default export or export named "${name}"`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return { name, key, file, exportName };
|
|
98
|
+
};
|
|
99
|
+
var scanComponents = async (config) => {
|
|
100
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
101
|
+
const skipped = [];
|
|
102
|
+
const missingRoots = [];
|
|
103
|
+
for (const root of config.roots) {
|
|
104
|
+
if (!existsSync(root)) {
|
|
105
|
+
missingRoots.push(root);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const files = await glob(["**/*.{tsx,jsx,js}"], {
|
|
109
|
+
cwd: root,
|
|
110
|
+
ignore: [...ALWAYS_EXCLUDE, ...config.exclude],
|
|
111
|
+
absolute: true
|
|
112
|
+
});
|
|
113
|
+
for (const file of files.map((f) => path2.resolve(f)).sort()) {
|
|
114
|
+
const result = toEntry(file, root);
|
|
115
|
+
if (!result) continue;
|
|
116
|
+
if (!("key" in result)) {
|
|
117
|
+
skipped.push(result);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const existing = byKey.get(result.key);
|
|
121
|
+
if (!existing) {
|
|
122
|
+
byKey.set(result.key, result);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (isIndexPair(existing, result)) {
|
|
126
|
+
const keepResult = path2.basename(result.file).startsWith("index.");
|
|
127
|
+
if (keepResult) byKey.set(result.key, result);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
throw new ComponentRegistryError(
|
|
131
|
+
`Two components resolve to the same name "${result.name}":
|
|
132
|
+
${path2.relative(config.cwd, existing.file)}
|
|
133
|
+
${path2.relative(config.cwd, result.file)}
|
|
134
|
+
Rename one of them, or add it to components.exclude in amplifyup.config.ts.`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const entries = [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
139
|
+
return { entries, skipped, missingRoots };
|
|
140
|
+
};
|
|
141
|
+
var importPath = (fromFile, toFile) => {
|
|
142
|
+
const withoutExt = toFile.slice(0, toFile.length - path2.extname(toFile).length);
|
|
143
|
+
const relative = path2.relative(path2.dirname(fromFile), withoutExt).split(path2.sep).join("/").replace(/\/index$/, "");
|
|
144
|
+
return relative.startsWith(".") ? relative : `./${relative}`;
|
|
145
|
+
};
|
|
146
|
+
var importLine = (entry, local, outputFile) => {
|
|
147
|
+
const from = JSON.stringify(importPath(outputFile, entry.file));
|
|
148
|
+
return entry.exportName === "default" ? `import ${local} from ${from};` : `import { ${entry.exportName} as ${local} } from ${from};`;
|
|
149
|
+
};
|
|
150
|
+
var renderRegistrySource = (entries, outputFile) => {
|
|
151
|
+
const imports = entries.map((entry, i) => importLine(entry, `C${i}`, outputFile));
|
|
152
|
+
const members = entries.map((entry, i) => ` ${JSON.stringify(entry.name)}: C${i},`);
|
|
153
|
+
return [
|
|
154
|
+
"'use client';",
|
|
155
|
+
"",
|
|
156
|
+
"// Generated by Amplify UP from your components folder. Do not edit \u2014",
|
|
157
|
+
"// add, rename or delete component files instead.",
|
|
158
|
+
"",
|
|
159
|
+
"import { defineComponentRegistry, bindAmplifyPage } from '@amplifyup/sdk/react';",
|
|
160
|
+
...imports,
|
|
161
|
+
"",
|
|
162
|
+
"export const componentRegistry = defineComponentRegistry({",
|
|
163
|
+
...members,
|
|
164
|
+
"});",
|
|
165
|
+
"",
|
|
166
|
+
"export const AmplifyPage = bindAmplifyPage(componentRegistry);",
|
|
167
|
+
""
|
|
168
|
+
].join("\n");
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// src/cli/build-registry.ts
|
|
172
|
+
var LOG_PREFIX = "[Amplify UP]";
|
|
173
|
+
var WATCH_DEBOUNCE_MS = 120;
|
|
174
|
+
var writeIfChanged = (file, content) => {
|
|
175
|
+
if (existsSync(file) && readFileSync(file, "utf8") === content) return false;
|
|
176
|
+
mkdirSync(path2.dirname(file), { recursive: true });
|
|
177
|
+
writeFileSync(file, content);
|
|
178
|
+
return true;
|
|
179
|
+
};
|
|
180
|
+
var ensureSelfIgnored = (outputFile) => {
|
|
181
|
+
const dir = path2.dirname(outputFile);
|
|
182
|
+
if (path2.basename(dir) !== ".amplifyup") return;
|
|
183
|
+
writeIfChanged(path2.join(dir, ".gitignore"), "*\n");
|
|
184
|
+
};
|
|
185
|
+
var buildRegistryFromConfig = async (config) => {
|
|
186
|
+
const scan = await scanComponents(config);
|
|
187
|
+
const source = renderRegistrySource(scan.entries, config.outputFile);
|
|
188
|
+
const changed = writeIfChanged(config.outputFile, source);
|
|
189
|
+
ensureSelfIgnored(config.outputFile);
|
|
190
|
+
return { ...scan, outputFile: config.outputFile, changed };
|
|
191
|
+
};
|
|
192
|
+
var buildRegistry = async (cwd) => buildRegistryFromConfig(await loadComponentsConfig(cwd));
|
|
193
|
+
var reportRegistry = (result, cwd) => {
|
|
194
|
+
const rel = (file) => path2.relative(cwd, file) || ".";
|
|
195
|
+
for (const root of result.missingRoots) {
|
|
196
|
+
console.warn(`${LOG_PREFIX} Components folder not found: ${rel(root)}`);
|
|
197
|
+
}
|
|
198
|
+
for (const skip of result.skipped) {
|
|
199
|
+
console.warn(`${LOG_PREFIX} Skipped ${rel(skip.file)}: ${skip.reason}`);
|
|
200
|
+
}
|
|
201
|
+
console.log(
|
|
202
|
+
`${LOG_PREFIX} Component registry: ${result.entries.length} component(s) \u2192 ${rel(result.outputFile)}`
|
|
203
|
+
);
|
|
204
|
+
};
|
|
205
|
+
var watchRegistry = async (cwd) => {
|
|
206
|
+
const config = await loadComponentsConfig(cwd);
|
|
207
|
+
const watchers = [];
|
|
208
|
+
let timer;
|
|
209
|
+
const rebuild = () => {
|
|
210
|
+
clearTimeout(timer);
|
|
211
|
+
timer = setTimeout(() => {
|
|
212
|
+
buildRegistryFromConfig(config).then((result) => {
|
|
213
|
+
if (result.changed) reportRegistry(result, cwd);
|
|
214
|
+
}).catch((error) => {
|
|
215
|
+
console.error(`${LOG_PREFIX} Component registry update failed:`, error);
|
|
216
|
+
});
|
|
217
|
+
}, WATCH_DEBOUNCE_MS);
|
|
218
|
+
};
|
|
219
|
+
for (const root of config.roots.filter((r) => existsSync(r))) {
|
|
220
|
+
watchers.push(watch(root, { recursive: true }, rebuild));
|
|
221
|
+
}
|
|
222
|
+
return () => {
|
|
223
|
+
clearTimeout(timer);
|
|
224
|
+
watchers.forEach((watcher) => watcher.close());
|
|
225
|
+
};
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// src/next.ts
|
|
229
|
+
var DEV_PHASE = "phase-development-server";
|
|
230
|
+
var STATE_KEY = Symbol.for("amplifyup.registryBuild");
|
|
231
|
+
var registryState = () => {
|
|
232
|
+
const store = globalThis;
|
|
233
|
+
store[STATE_KEY] ?? (store[STATE_KEY] = {});
|
|
234
|
+
return store[STATE_KEY];
|
|
235
|
+
};
|
|
236
|
+
var prepareRegistry = async (phase) => {
|
|
237
|
+
const cwd = process.cwd();
|
|
238
|
+
const state = registryState();
|
|
239
|
+
state.built ?? (state.built = buildRegistry(cwd).then((result) => reportRegistry(result, cwd)));
|
|
240
|
+
await state.built;
|
|
241
|
+
if (phase === DEV_PHASE && !state.watching) {
|
|
242
|
+
state.watching = true;
|
|
243
|
+
await watchRegistry(cwd);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
var withAmplifyUp = (nextConfig = {}) => async (phase, context) => {
|
|
247
|
+
await prepareRegistry(phase);
|
|
248
|
+
return typeof nextConfig === "function" ? nextConfig(phase, context) : nextConfig;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
export { withAmplifyUp };
|
|
252
|
+
//# sourceMappingURL=next.mjs.map
|
|
253
|
+
//# sourceMappingURL=next.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/load-config.ts","../src/component-key.ts","../src/cli/scan-components.ts","../src/cli/render-registry.ts","../src/cli/build-registry.ts","../src/next.ts"],"names":["path","existsSync","readFileSync"],"mappings":"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","file":"next.mjs","sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport { createJiti } from 'jiti';\nimport type { AmplifyConfig } from '../config';\n\nconst CONFIG_FILES = [\n 'amplifyup.config.ts',\n 'amplifyup.config.mts',\n 'amplifyup.config.mjs',\n 'amplifyup.config.js',\n 'amplifyup.config.cjs',\n];\n\nexport type ResolvedComponentsConfig = {\n cwd: string;\n /** Absolute component folders. */\n roots: string[];\n exclude: string[];\n /** Absolute generated file path, extension included. */\n outputFile: string;\n /** Config file that was loaded, if any. */\n configFile?: string;\n};\n\nconst findConfigFile = (cwd: string): string | undefined =>\n CONFIG_FILES.map((name) => path.join(cwd, name)).find((file) => existsSync(file));\n\nconst defaultRoots = (cwd: string): string[] =>\n existsSync(path.join(cwd, 'src')) ? ['src/components'] : ['components'];\n\nconst defaultOutput = (firstRoot: string): string =>\n path.join(path.dirname(firstRoot), '.amplifyup', 'component-registry');\n\n/** TS projects get `.tsx`; plain JS projects get `.jsx` so Next doesn't switch them to TypeScript. */\nconst outputExtension = (cwd: string): string =>\n existsSync(path.join(cwd, 'tsconfig.json')) ? '.tsx' : '.jsx';\n\nexport const loadComponentsConfig = async (\n cwd: string\n): Promise<ResolvedComponentsConfig> => {\n const configFile = findConfigFile(cwd);\n let config: AmplifyConfig = {};\n\n if (configFile) {\n const jiti = createJiti(path.join(cwd, 'amplifyup.config.loader'));\n config = (await jiti.import<AmplifyConfig>(configFile, { default: true })) ?? {};\n }\n\n const components = config.components ?? {};\n const roots = components.roots?.length ? components.roots : defaultRoots(cwd);\n const output = components.output ?? defaultOutput(roots[0]);\n\n return {\n cwd,\n roots: roots.map((root) => path.resolve(cwd, root)),\n exclude: components.exclude ?? [],\n outputFile: path.resolve(cwd, output) + outputExtension(cwd),\n configFile,\n };\n};\n","/**\n * One matching rule for layout component IDs and component file names, so\n * `Hero`, `hero`, `HERO` and `e2e-hero` / `E2eHero` resolve to the same entry.\n */\nexport const componentKey = (id: string): string =>\n id.toLowerCase().replace(/[^a-z0-9]/g, '');\n","import { existsSync, readFileSync } from 'fs';\nimport path from 'path';\nimport { glob } from 'tinyglobby';\nimport { componentKey } from '../component-key';\nimport type { ResolvedComponentsConfig } from './load-config';\n\nconst ALWAYS_EXCLUDE = [\n '**/*.test.*',\n '**/*.spec.*',\n '**/*.stories.*',\n '**/*.d.ts',\n '**/__tests__/**',\n '**/__mocks__/**',\n];\n\nexport type RegistryEntry = {\n /** Registry name — the file (or folder, for `index` files) name. */\n name: string;\n key: string;\n /** Absolute file path. */\n file: string;\n /** `default`, or the named export that is the component. */\n exportName: string;\n};\n\nexport type SkippedFile = {\n file: string;\n reason: string;\n};\n\nexport type ScanResult = {\n entries: RegistryEntry[];\n skipped: SkippedFile[];\n missingRoots: string[];\n};\n\nexport class ComponentRegistryError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ComponentRegistryError';\n }\n}\n\nconst NAMED_DECLARATION =\n /export\\s+(?:declare\\s+)?(?:async\\s+)?(?:const|let|var|function\\*?|class)\\s+([A-Za-z_$][\\w$]*)/g;\n\nconst EXPORT_LIST = /export\\s*\\{([^}]*)\\}/g;\n\n/** Export names a file declares, read from source (no type checking needed). */\nconst readExports = (source: string): { hasDefault: boolean; named: string[] } => {\n const named: string[] = [];\n let hasDefault = /export\\s+default\\b/.test(source);\n\n for (const match of source.matchAll(NAMED_DECLARATION)) {\n named.push(match[1]);\n }\n\n for (const match of source.matchAll(EXPORT_LIST)) {\n for (const part of match[1].split(',')) {\n const spec = part.trim();\n if (!spec || spec.startsWith('type ')) continue;\n\n const exported = spec.split(/\\s+as\\s+/).pop()!.trim();\n if (exported === 'default') {\n hasDefault = true;\n } else {\n named.push(exported);\n }\n }\n }\n\n return { hasDefault, named };\n};\n\nconst entryName = (file: string, root: string): string | null => {\n const base = path.basename(file, path.extname(file));\n if (base !== 'index') return base;\n\n // `components/index.tsx` is a barrel, not a component.\n const dir = path.dirname(file);\n return dir === root ? null : path.basename(dir);\n};\n\n/** `Hero/index.tsx` and `Hero/Hero.tsx` describe one component — keep the index. */\nconst isIndexPair = (a: RegistryEntry, b: RegistryEntry): boolean =>\n path.dirname(a.file) === path.dirname(b.file) &&\n [a, b].some((entry) => path.basename(entry.file).startsWith('index.'));\n\nconst toEntry = (\n file: string,\n root: string\n): RegistryEntry | SkippedFile | null => {\n const name = entryName(file, root);\n if (!name) return null;\n\n const key = componentKey(name);\n const { hasDefault, named } = readExports(readFileSync(file, 'utf8'));\n const exportName = hasDefault\n ? 'default'\n : named.find((exported) => componentKey(exported) === key);\n\n if (!exportName) {\n return {\n file,\n reason: `no default export or export named \"${name}\"`,\n };\n }\n\n return { name, key, file, exportName };\n};\n\nexport const scanComponents = async (\n config: ResolvedComponentsConfig\n): Promise<ScanResult> => {\n const byKey = new Map<string, RegistryEntry>();\n const skipped: SkippedFile[] = [];\n const missingRoots: string[] = [];\n\n for (const root of config.roots) {\n if (!existsSync(root)) {\n missingRoots.push(root);\n continue;\n }\n\n const files = await glob(['**/*.{tsx,jsx,js}'], {\n cwd: root,\n ignore: [...ALWAYS_EXCLUDE, ...config.exclude],\n absolute: true,\n });\n\n for (const file of files.map((f) => path.resolve(f)).sort()) {\n const result = toEntry(file, root);\n if (!result) continue;\n\n if (!('key' in result)) {\n skipped.push(result);\n continue;\n }\n\n const existing = byKey.get(result.key);\n if (!existing) {\n byKey.set(result.key, result);\n continue;\n }\n\n if (isIndexPair(existing, result)) {\n const keepResult = path.basename(result.file).startsWith('index.');\n if (keepResult) byKey.set(result.key, result);\n continue;\n }\n\n throw new ComponentRegistryError(\n `Two components resolve to the same name \"${result.name}\":\\n` +\n ` ${path.relative(config.cwd, existing.file)}\\n` +\n ` ${path.relative(config.cwd, result.file)}\\n` +\n 'Rename one of them, or add it to components.exclude in amplifyup.config.ts.'\n );\n }\n }\n\n const entries = [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));\n return { entries, skipped, missingRoots };\n};\n","import path from 'path';\nimport type { RegistryEntry } from './scan-components';\n\nconst importPath = (fromFile: string, toFile: string): string => {\n const withoutExt = toFile.slice(0, toFile.length - path.extname(toFile).length);\n const relative = path\n .relative(path.dirname(fromFile), withoutExt)\n .split(path.sep)\n .join('/')\n .replace(/\\/index$/, '');\n return relative.startsWith('.') ? relative : `./${relative}`;\n};\n\nconst importLine = (entry: RegistryEntry, local: string, outputFile: string): string => {\n const from = JSON.stringify(importPath(outputFile, entry.file));\n return entry.exportName === 'default'\n ? `import ${local} from ${from};`\n : `import { ${entry.exportName} as ${local} } from ${from};`;\n};\n\n/** Source of the generated component registry module. Stable for unchanged input. */\nexport const renderRegistrySource = (\n entries: RegistryEntry[],\n outputFile: string\n): string => {\n const imports = entries.map((entry, i) => importLine(entry, `C${i}`, outputFile));\n const members = entries.map((entry, i) => ` ${JSON.stringify(entry.name)}: C${i},`);\n\n return [\n \"'use client';\",\n '',\n '// Generated by Amplify UP from your components folder. Do not edit —',\n '// add, rename or delete component files instead.',\n '',\n \"import { defineComponentRegistry, bindAmplifyPage } from '@amplifyup/sdk/react';\",\n ...imports,\n '',\n 'export const componentRegistry = defineComponentRegistry({',\n ...members,\n '});',\n '',\n 'export const AmplifyPage = bindAmplifyPage(componentRegistry);',\n '',\n ].join('\\n');\n};\n","import { existsSync, mkdirSync, readFileSync, watch, writeFileSync, type FSWatcher } from 'fs';\nimport path from 'path';\nimport { loadComponentsConfig, type ResolvedComponentsConfig } from './load-config';\nimport { scanComponents, type ScanResult } from './scan-components';\nimport { renderRegistrySource } from './render-registry';\n\nconst LOG_PREFIX = '[Amplify UP]';\nconst WATCH_DEBOUNCE_MS = 120;\n\nexport type BuildRegistryResult = ScanResult & {\n outputFile: string;\n /** False when the file already had this content (no rewrite, no HMR churn). */\n changed: boolean;\n};\n\nconst writeIfChanged = (file: string, content: string): boolean => {\n if (existsSync(file) && readFileSync(file, 'utf8') === content) return false;\n\n mkdirSync(path.dirname(file), { recursive: true });\n writeFileSync(file, content);\n return true;\n};\n\n/** The generated folder ignores itself, so sites never commit it. */\nconst ensureSelfIgnored = (outputFile: string): void => {\n const dir = path.dirname(outputFile);\n if (path.basename(dir) !== '.amplifyup') return;\n writeIfChanged(path.join(dir, '.gitignore'), '*\\n');\n};\n\nexport const buildRegistryFromConfig = async (\n config: ResolvedComponentsConfig\n): Promise<BuildRegistryResult> => {\n const scan = await scanComponents(config);\n const source = renderRegistrySource(scan.entries, config.outputFile);\n\n const changed = writeIfChanged(config.outputFile, source);\n ensureSelfIgnored(config.outputFile);\n\n return { ...scan, outputFile: config.outputFile, changed };\n};\n\nexport const buildRegistry = async (cwd: string): Promise<BuildRegistryResult> =>\n buildRegistryFromConfig(await loadComponentsConfig(cwd));\n\nexport const reportRegistry = (result: BuildRegistryResult, cwd: string): void => {\n const rel = (file: string) => path.relative(cwd, file) || '.';\n\n for (const root of result.missingRoots) {\n console.warn(`${LOG_PREFIX} Components folder not found: ${rel(root)}`);\n }\n\n for (const skip of result.skipped) {\n console.warn(`${LOG_PREFIX} Skipped ${rel(skip.file)}: ${skip.reason}`);\n }\n\n console.log(\n `${LOG_PREFIX} Component registry: ${result.entries.length} component(s) → ${rel(result.outputFile)}`\n );\n};\n\n/** Regenerates on add/remove/rename. Returns a function that stops watching. */\nexport const watchRegistry = async (cwd: string): Promise<() => void> => {\n const config = await loadComponentsConfig(cwd);\n const watchers: FSWatcher[] = [];\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const rebuild = () => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n buildRegistryFromConfig(config)\n .then((result) => {\n if (result.changed) reportRegistry(result, cwd);\n })\n .catch((error: unknown) => {\n console.error(`${LOG_PREFIX} Component registry update failed:`, error);\n });\n }, WATCH_DEBOUNCE_MS);\n };\n\n for (const root of config.roots.filter((r) => existsSync(r))) {\n watchers.push(watch(root, { recursive: true }, rebuild));\n }\n\n return () => {\n clearTimeout(timer);\n watchers.forEach((watcher) => watcher.close());\n };\n};\n","/**\n * `withAmplifyUp(nextConfig)` — builds the component registry whenever Next\n * loads its config (`next build`, `next dev`) and keeps it current during dev.\n */\nimport { buildRegistry, reportRegistry, watchRegistry } from './cli/build-registry';\n\ntype NextConfigObject = Record<string, unknown>;\n\ntype NextConfigContext = {\n defaultConfig: NextConfigObject;\n};\n\ntype NextConfigFunction = (\n phase: string,\n context: NextConfigContext\n) => NextConfigObject | Promise<NextConfigObject>;\n\ntype NextConfigInput = NextConfigObject | NextConfigFunction;\n\nconst DEV_PHASE = 'phase-development-server';\n\ntype RegistryState = {\n built?: Promise<void>;\n watching?: boolean;\n};\n\n// Next loads its config more than once per process; build and watch only once.\nconst STATE_KEY = Symbol.for('amplifyup.registryBuild');\n\nconst registryState = (): RegistryState => {\n const store = globalThis as typeof globalThis & { [STATE_KEY]?: RegistryState };\n store[STATE_KEY] ??= {};\n return store[STATE_KEY]!;\n};\n\nconst prepareRegistry = async (phase: string): Promise<void> => {\n const cwd = process.cwd();\n const state = registryState();\n\n state.built ??= buildRegistry(cwd).then((result) => reportRegistry(result, cwd));\n await state.built;\n\n if (phase === DEV_PHASE && !state.watching) {\n state.watching = true;\n await watchRegistry(cwd);\n }\n};\n\nexport const withAmplifyUp = (nextConfig: NextConfigInput = {}): NextConfigFunction =>\n async (phase, context) => {\n await prepareRegistry(phase);\n return typeof nextConfig === 'function' ? nextConfig(phase, context) : nextConfig;\n };\n"]}
|