@amplifyup/sdk 0.2.4 → 0.3.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/README.md +13 -1
  2. package/dist/{AmplifyRenderer-BNWBrFQN.d.ts → AmplifyRenderer-CwAYY8K1.d.mts} +4 -5
  3. package/dist/{AmplifyRenderer-CPUr9Bkc.d.mts → AmplifyRenderer-D40crBWY.d.ts} +4 -5
  4. package/dist/AmplifyRenderer.d.mts +2 -3
  5. package/dist/AmplifyRenderer.d.ts +2 -3
  6. package/dist/AmplifyRenderer.js +3 -30
  7. package/dist/AmplifyRenderer.js.map +1 -1
  8. package/dist/AmplifyRenderer.mjs +3 -30
  9. package/dist/AmplifyRenderer.mjs.map +1 -1
  10. package/dist/index.d.mts +240 -4
  11. package/dist/index.d.ts +240 -4
  12. package/dist/index.js +59 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.mjs +57 -2
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/next.js +101 -8
  17. package/dist/next.js.map +1 -1
  18. package/dist/next.mjs +100 -8
  19. package/dist/next.mjs.map +1 -1
  20. package/dist/{query-Xo9cy-2F.d.ts → query-BeQibYGm.d.ts} +56 -56
  21. package/dist/{query-DYjs4LQQ.d.mts → query-CwtZtJX8.d.mts} +56 -56
  22. package/dist/react.d.mts +23 -17
  23. package/dist/react.d.ts +23 -17
  24. package/dist/react.js +4 -31
  25. package/dist/react.js.map +1 -1
  26. package/dist/react.mjs +4 -31
  27. package/dist/react.mjs.map +1 -1
  28. package/dist/server.d.mts +3 -3
  29. package/dist/server.d.ts +3 -3
  30. package/dist/server.js +1 -1
  31. package/dist/server.js.map +1 -1
  32. package/dist/server.mjs +1 -1
  33. package/dist/server.mjs.map +1 -1
  34. package/dist/{types-ffQNIQCK.d.ts → types-CxucvIL6.d.mts} +1 -1
  35. package/dist/{types-ffQNIQCK.d.mts → types-CxucvIL6.d.ts} +1 -1
  36. package/package.json +8 -7
  37. package/dist/cli.d.mts +0 -1
  38. package/dist/cli.d.ts +0 -1
  39. package/dist/cli.js +0 -266
  40. package/dist/cli.js.map +0 -1
  41. package/dist/cli.mjs +0 -260
  42. package/dist/cli.mjs.map +0 -1
package/dist/next.js CHANGED
@@ -4,10 +4,12 @@ var fs = require('fs');
4
4
  var path2 = require('path');
5
5
  var jiti = require('jiti');
6
6
  var tinyglobby = require('tinyglobby');
7
+ var semver = require('semver');
7
8
 
8
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
10
 
10
11
  var path2__default = /*#__PURE__*/_interopDefault(path2);
12
+ var semver__default = /*#__PURE__*/_interopDefault(semver);
11
13
 
12
14
  /* @amplifyup/sdk - https://amplifyup.ai */
13
15
 
@@ -44,7 +46,7 @@ var loadComponentsConfig = async (cwd) => {
44
46
  // src/component-key.ts
45
47
  var componentKey = (id) => id.toLowerCase().replace(/[^a-z0-9]/g, "");
46
48
 
47
- // src/cli/scan-components.ts
49
+ // src/registry/scan-components.ts
48
50
  var ALWAYS_EXCLUDE = [
49
51
  "**/*.test.*",
50
52
  "**/*.spec.*",
@@ -144,13 +146,76 @@ Rename one of them, or add it to components.exclude in amplifyup.config.ts.`
144
146
  const entries = [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));
145
147
  return { entries, skipped, missingRoots };
146
148
  };
149
+ var SDK_PACKAGE = "@amplifyup/sdk";
150
+ var readJson = (file) => JSON.parse(fs.readFileSync(file, "utf8"));
151
+ var findInstalledPackage = (cwd, name) => {
152
+ let dir = cwd;
153
+ while (true) {
154
+ const candidate = path2__default.default.join(dir, "node_modules", name, "package.json");
155
+ if (fs.existsSync(candidate)) return candidate;
156
+ const parent = path2__default.default.dirname(dir);
157
+ if (parent === dir) return null;
158
+ dir = parent;
159
+ }
160
+ };
161
+ var peerWarning = (pkg, sdkVersion) => {
162
+ const range = pkg.peerDependencies?.[SDK_PACKAGE];
163
+ if (!range || !sdkVersion) return null;
164
+ if (semver__default.default.satisfies(sdkVersion, range, { includePrerelease: true })) return null;
165
+ return `${pkg.name} expects ${SDK_PACKAGE} ${range}, but ${sdkVersion} is installed. Update one of them.`;
166
+ };
167
+ var manifestEntries = (dependency, manifestFile, warnings) => {
168
+ const manifest = readJson(manifestFile);
169
+ const entries = [];
170
+ for (const component of manifest.components ?? []) {
171
+ const { component_id: id, export_name: exportName } = component;
172
+ if (typeof id !== "string" || typeof exportName !== "string") {
173
+ warnings.push(`${dependency}: skipped a manifest component without component_id and export_name`);
174
+ continue;
175
+ }
176
+ entries.push({
177
+ name: id,
178
+ key: componentKey(id),
179
+ file: manifestFile,
180
+ exportName,
181
+ module: dependency
182
+ });
183
+ }
184
+ return entries;
185
+ };
186
+ var scanPackages = (cwd) => {
187
+ const siteManifest = path2__default.default.join(cwd, "package.json");
188
+ if (!fs.existsSync(siteManifest)) return { entries: [], warnings: [] };
189
+ const site = readJson(siteManifest);
190
+ const dependencies = Object.keys({ ...site.devDependencies, ...site.dependencies }).sort();
191
+ const sdkPackageFile = findInstalledPackage(cwd, SDK_PACKAGE);
192
+ const sdkVersion = sdkPackageFile ? readJson(sdkPackageFile).version : void 0;
193
+ const entries = [];
194
+ const warnings = [];
195
+ for (const dependency of dependencies) {
196
+ const packageFile = findInstalledPackage(cwd, dependency);
197
+ if (!packageFile) continue;
198
+ const pkg = readJson(packageFile);
199
+ const manifestPath = pkg.amplifyup?.manifest;
200
+ if (!manifestPath) continue;
201
+ const manifestFile = path2__default.default.resolve(path2__default.default.dirname(packageFile), manifestPath);
202
+ if (!fs.existsSync(manifestFile)) {
203
+ warnings.push(`${dependency}: component manifest not found at ${manifestPath}`);
204
+ continue;
205
+ }
206
+ const warning = peerWarning(pkg, sdkVersion);
207
+ if (warning) warnings.push(warning);
208
+ entries.push(...manifestEntries(dependency, manifestFile, warnings));
209
+ }
210
+ return { entries, warnings };
211
+ };
147
212
  var importPath = (fromFile, toFile) => {
148
213
  const withoutExt = toFile.slice(0, toFile.length - path2__default.default.extname(toFile).length);
149
214
  const relative = path2__default.default.relative(path2__default.default.dirname(fromFile), withoutExt).split(path2__default.default.sep).join("/").replace(/\/index$/, "");
150
215
  return relative.startsWith(".") ? relative : `./${relative}`;
151
216
  };
152
217
  var importLine = (entry, local, outputFile) => {
153
- const from = JSON.stringify(importPath(outputFile, entry.file));
218
+ const from = JSON.stringify(entry.module ?? importPath(outputFile, entry.file));
154
219
  return entry.exportName === "default" ? `import ${local} from ${from};` : `import { ${entry.exportName} as ${local} } from ${from};`;
155
220
  };
156
221
  var renderRegistrySource = (entries, outputFile) => {
@@ -159,8 +224,8 @@ var renderRegistrySource = (entries, outputFile) => {
159
224
  return [
160
225
  "'use client';",
161
226
  "",
162
- "// Generated by Amplify UP from your components folder. Do not edit \u2014",
163
- "// add, rename or delete component files instead.",
227
+ "// Generated by Amplify UP from your components folder and installed component",
228
+ "// packages. Do not edit \u2014 add, rename or delete component files instead.",
164
229
  "",
165
230
  "import { defineComponentRegistry, bindAmplifyPage } from '@amplifyup/sdk/react';",
166
231
  ...imports,
@@ -174,7 +239,7 @@ var renderRegistrySource = (entries, outputFile) => {
174
239
  ].join("\n");
175
240
  };
176
241
 
177
- // src/cli/build-registry.ts
242
+ // src/registry/build-registry.ts
178
243
  var LOG_PREFIX = "[Amplify UP]";
179
244
  var WATCH_DEBOUNCE_MS = 120;
180
245
  var writeIfChanged = (file, content) => {
@@ -188,12 +253,37 @@ var ensureSelfIgnored = (outputFile) => {
188
253
  if (path2__default.default.basename(dir) !== ".amplifyup") return;
189
254
  writeIfChanged(path2__default.default.join(dir, ".gitignore"), "*\n");
190
255
  };
256
+ var describeEntry = (entry, cwd) => entry.module ? `${entry.module} (installed package)` : path2__default.default.relative(cwd, entry.file);
257
+ var mergeEntries = (local, packaged, cwd) => {
258
+ const byKey = new Map(local.map((entry) => [entry.key, entry]));
259
+ for (const entry of packaged) {
260
+ const existing = byKey.get(entry.key);
261
+ if (existing) {
262
+ throw new ComponentRegistryError(
263
+ `Two components resolve to the same name "${entry.name}":
264
+ ${describeEntry(existing, cwd)}
265
+ ${describeEntry(entry, cwd)}
266
+ Rename the local component, or remove one of the packages.`
267
+ );
268
+ }
269
+ byKey.set(entry.key, entry);
270
+ }
271
+ return [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));
272
+ };
191
273
  var buildRegistryFromConfig = async (config) => {
192
274
  const scan = await scanComponents(config);
193
- const source = renderRegistrySource(scan.entries, config.outputFile);
275
+ const packages = scanPackages(config.cwd);
276
+ const entries = mergeEntries(scan.entries, packages.entries, config.cwd);
277
+ const source = renderRegistrySource(entries, config.outputFile);
194
278
  const changed = writeIfChanged(config.outputFile, source);
195
279
  ensureSelfIgnored(config.outputFile);
196
- return { ...scan, outputFile: config.outputFile, changed };
280
+ return {
281
+ ...scan,
282
+ entries,
283
+ warnings: packages.warnings,
284
+ outputFile: config.outputFile,
285
+ changed
286
+ };
197
287
  };
198
288
  var buildRegistry = async (cwd) => buildRegistryFromConfig(await loadComponentsConfig(cwd));
199
289
  var reportRegistry = (result, cwd) => {
@@ -201,6 +291,9 @@ var reportRegistry = (result, cwd) => {
201
291
  for (const root of result.missingRoots) {
202
292
  console.warn(`${LOG_PREFIX} Components folder not found: ${rel(root)}`);
203
293
  }
294
+ for (const warning of result.warnings) {
295
+ console.warn(`${LOG_PREFIX} ${warning}`);
296
+ }
204
297
  for (const skip of result.skipped) {
205
298
  console.warn(`${LOG_PREFIX} Skipped ${rel(skip.file)}: ${skip.reason}`);
206
299
  }
@@ -233,7 +326,7 @@ var watchRegistry = async (cwd) => {
233
326
 
234
327
  // src/next.ts
235
328
  var DEV_PHASE = "phase-development-server";
236
- var STATE_KEY = Symbol.for("amplifyup.registryBuild");
329
+ var STATE_KEY = /* @__PURE__ */ Symbol.for("amplifyup.registryBuild");
237
330
  var registryState = () => {
238
331
  const store = globalThis;
239
332
  store[STATE_KEY] ?? (store[STATE_KEY] = {});
package/dist/next.js.map CHANGED
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/registry/load-config.ts","../src/component-key.ts","../src/registry/scan-components.ts","../src/registry/scan-packages.ts","../src/registry/render-registry.ts","../src/registry/build-registry.ts","../src/next.ts"],"names":["path","existsSync","jiti","createJiti","readFileSync","glob","semver","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 (the package manifest, for package components). */\n file: string;\n /** `default`, or the named export that is the component. */\n exportName: string;\n /** Package to import from, for components shipped by an installed package. */\n module?: 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 { existsSync, readFileSync } from 'fs';\nimport path from 'path';\nimport semver from 'semver';\nimport { componentKey } from '../component-key';\nimport type { RegistryEntry } from './scan-components';\n\nconst SDK_PACKAGE = '@amplifyup/sdk';\n\ntype PackageJson = {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n amplifyup?: { manifest?: string };\n};\n\ntype ManifestComponent = {\n component_id?: unknown;\n export_name?: unknown;\n};\n\ntype PackageManifestFile = {\n components?: ManifestComponent[];\n};\n\nexport type PackageScanResult = {\n entries: RegistryEntry[];\n warnings: string[];\n};\n\nconst readJson = <T>(file: string): T => JSON.parse(readFileSync(file, 'utf8')) as T;\n\n/** Installed copy of a dependency, found the way Node resolves it (walking up node_modules). */\nconst findInstalledPackage = (cwd: string, name: string): string | null => {\n let dir = cwd;\n\n while (true) {\n const candidate = path.join(dir, 'node_modules', name, 'package.json');\n if (existsSync(candidate)) return candidate;\n\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n};\n\nconst peerWarning = (pkg: PackageJson, sdkVersion: string | undefined): string | null => {\n const range = pkg.peerDependencies?.[SDK_PACKAGE];\n if (!range || !sdkVersion) return null;\n if (semver.satisfies(sdkVersion, range, { includePrerelease: true })) return null;\n\n return `${pkg.name} expects ${SDK_PACKAGE} ${range}, but ${sdkVersion} is installed. Update one of them.`;\n};\n\nconst manifestEntries = (\n dependency: string,\n manifestFile: string,\n warnings: string[]\n): RegistryEntry[] => {\n const manifest = readJson<PackageManifestFile>(manifestFile);\n const entries: RegistryEntry[] = [];\n\n for (const component of manifest.components ?? []) {\n const { component_id: id, export_name: exportName } = component;\n if (typeof id !== 'string' || typeof exportName !== 'string') {\n warnings.push(`${dependency}: skipped a manifest component without component_id and export_name`);\n continue;\n }\n\n entries.push({\n name: id,\n key: componentKey(id),\n file: manifestFile,\n exportName,\n module: dependency,\n });\n }\n\n return entries;\n};\n\n/**\n * Components shipped by the site's direct dependencies. A package opts in with\n * `\"amplifyup\": { \"manifest\": \"./dist/amplifyup.manifest.json\" }` in its package.json.\n */\nexport const scanPackages = (cwd: string): PackageScanResult => {\n const siteManifest = path.join(cwd, 'package.json');\n if (!existsSync(siteManifest)) return { entries: [], warnings: [] };\n\n const site = readJson<PackageJson>(siteManifest);\n const dependencies = Object.keys({ ...site.devDependencies, ...site.dependencies }).sort();\n const sdkPackageFile = findInstalledPackage(cwd, SDK_PACKAGE);\n const sdkVersion = sdkPackageFile ? readJson<PackageJson>(sdkPackageFile).version : undefined;\n\n const entries: RegistryEntry[] = [];\n const warnings: string[] = [];\n\n for (const dependency of dependencies) {\n const packageFile = findInstalledPackage(cwd, dependency);\n if (!packageFile) continue;\n\n const pkg = readJson<PackageJson>(packageFile);\n const manifestPath = pkg.amplifyup?.manifest;\n if (!manifestPath) continue;\n\n const manifestFile = path.resolve(path.dirname(packageFile), manifestPath);\n if (!existsSync(manifestFile)) {\n warnings.push(`${dependency}: component manifest not found at ${manifestPath}`);\n continue;\n }\n\n const warning = peerWarning(pkg, sdkVersion);\n if (warning) warnings.push(warning);\n\n entries.push(...manifestEntries(dependency, manifestFile, warnings));\n }\n\n return { entries, warnings };\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(entry.module ?? 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 and installed component',\n '// packages. Do not edit — 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 { ComponentRegistryError, scanComponents, type RegistryEntry, type ScanResult } from './scan-components';\nimport { scanPackages } from './scan-packages';\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 /** Problems with installed component packages; the build still succeeds. */\n warnings: 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\nconst describeEntry = (entry: RegistryEntry, cwd: string): string =>\n entry.module ? `${entry.module} (installed package)` : path.relative(cwd, entry.file);\n\n/** Local components plus installed package components; one name may only resolve once. */\nconst mergeEntries = (\n local: RegistryEntry[],\n packaged: RegistryEntry[],\n cwd: string\n): RegistryEntry[] => {\n const byKey = new Map(local.map((entry) => [entry.key, entry]));\n\n for (const entry of packaged) {\n const existing = byKey.get(entry.key);\n if (existing) {\n throw new ComponentRegistryError(\n `Two components resolve to the same name \"${entry.name}\":\\n` +\n ` ${describeEntry(existing, cwd)}\\n` +\n ` ${describeEntry(entry, cwd)}\\n` +\n 'Rename the local component, or remove one of the packages.'\n );\n }\n byKey.set(entry.key, entry);\n }\n\n return [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport const buildRegistryFromConfig = async (\n config: ResolvedComponentsConfig\n): Promise<BuildRegistryResult> => {\n const scan = await scanComponents(config);\n const packages = scanPackages(config.cwd);\n const entries = mergeEntries(scan.entries, packages.entries, config.cwd);\n const source = renderRegistrySource(entries, config.outputFile);\n\n const changed = writeIfChanged(config.outputFile, source);\n ensureSelfIgnored(config.outputFile);\n\n return {\n ...scan,\n entries,\n warnings: packages.warnings,\n outputFile: config.outputFile,\n changed,\n };\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 warning of result.warnings) {\n console.warn(`${LOG_PREFIX} ${warning}`);\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 './registry/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 CHANGED
@@ -2,6 +2,7 @@ import { existsSync, watch, readFileSync, mkdirSync, writeFileSync } from 'fs';
2
2
  import path2 from 'path';
3
3
  import { createJiti } from 'jiti';
4
4
  import { glob } from 'tinyglobby';
5
+ import semver from 'semver';
5
6
 
6
7
  /* @amplifyup/sdk - https://amplifyup.ai */
7
8
 
@@ -38,7 +39,7 @@ var loadComponentsConfig = async (cwd) => {
38
39
  // src/component-key.ts
39
40
  var componentKey = (id) => id.toLowerCase().replace(/[^a-z0-9]/g, "");
40
41
 
41
- // src/cli/scan-components.ts
42
+ // src/registry/scan-components.ts
42
43
  var ALWAYS_EXCLUDE = [
43
44
  "**/*.test.*",
44
45
  "**/*.spec.*",
@@ -138,13 +139,76 @@ Rename one of them, or add it to components.exclude in amplifyup.config.ts.`
138
139
  const entries = [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));
139
140
  return { entries, skipped, missingRoots };
140
141
  };
142
+ var SDK_PACKAGE = "@amplifyup/sdk";
143
+ var readJson = (file) => JSON.parse(readFileSync(file, "utf8"));
144
+ var findInstalledPackage = (cwd, name) => {
145
+ let dir = cwd;
146
+ while (true) {
147
+ const candidate = path2.join(dir, "node_modules", name, "package.json");
148
+ if (existsSync(candidate)) return candidate;
149
+ const parent = path2.dirname(dir);
150
+ if (parent === dir) return null;
151
+ dir = parent;
152
+ }
153
+ };
154
+ var peerWarning = (pkg, sdkVersion) => {
155
+ const range = pkg.peerDependencies?.[SDK_PACKAGE];
156
+ if (!range || !sdkVersion) return null;
157
+ if (semver.satisfies(sdkVersion, range, { includePrerelease: true })) return null;
158
+ return `${pkg.name} expects ${SDK_PACKAGE} ${range}, but ${sdkVersion} is installed. Update one of them.`;
159
+ };
160
+ var manifestEntries = (dependency, manifestFile, warnings) => {
161
+ const manifest = readJson(manifestFile);
162
+ const entries = [];
163
+ for (const component of manifest.components ?? []) {
164
+ const { component_id: id, export_name: exportName } = component;
165
+ if (typeof id !== "string" || typeof exportName !== "string") {
166
+ warnings.push(`${dependency}: skipped a manifest component without component_id and export_name`);
167
+ continue;
168
+ }
169
+ entries.push({
170
+ name: id,
171
+ key: componentKey(id),
172
+ file: manifestFile,
173
+ exportName,
174
+ module: dependency
175
+ });
176
+ }
177
+ return entries;
178
+ };
179
+ var scanPackages = (cwd) => {
180
+ const siteManifest = path2.join(cwd, "package.json");
181
+ if (!existsSync(siteManifest)) return { entries: [], warnings: [] };
182
+ const site = readJson(siteManifest);
183
+ const dependencies = Object.keys({ ...site.devDependencies, ...site.dependencies }).sort();
184
+ const sdkPackageFile = findInstalledPackage(cwd, SDK_PACKAGE);
185
+ const sdkVersion = sdkPackageFile ? readJson(sdkPackageFile).version : void 0;
186
+ const entries = [];
187
+ const warnings = [];
188
+ for (const dependency of dependencies) {
189
+ const packageFile = findInstalledPackage(cwd, dependency);
190
+ if (!packageFile) continue;
191
+ const pkg = readJson(packageFile);
192
+ const manifestPath = pkg.amplifyup?.manifest;
193
+ if (!manifestPath) continue;
194
+ const manifestFile = path2.resolve(path2.dirname(packageFile), manifestPath);
195
+ if (!existsSync(manifestFile)) {
196
+ warnings.push(`${dependency}: component manifest not found at ${manifestPath}`);
197
+ continue;
198
+ }
199
+ const warning = peerWarning(pkg, sdkVersion);
200
+ if (warning) warnings.push(warning);
201
+ entries.push(...manifestEntries(dependency, manifestFile, warnings));
202
+ }
203
+ return { entries, warnings };
204
+ };
141
205
  var importPath = (fromFile, toFile) => {
142
206
  const withoutExt = toFile.slice(0, toFile.length - path2.extname(toFile).length);
143
207
  const relative = path2.relative(path2.dirname(fromFile), withoutExt).split(path2.sep).join("/").replace(/\/index$/, "");
144
208
  return relative.startsWith(".") ? relative : `./${relative}`;
145
209
  };
146
210
  var importLine = (entry, local, outputFile) => {
147
- const from = JSON.stringify(importPath(outputFile, entry.file));
211
+ const from = JSON.stringify(entry.module ?? importPath(outputFile, entry.file));
148
212
  return entry.exportName === "default" ? `import ${local} from ${from};` : `import { ${entry.exportName} as ${local} } from ${from};`;
149
213
  };
150
214
  var renderRegistrySource = (entries, outputFile) => {
@@ -153,8 +217,8 @@ var renderRegistrySource = (entries, outputFile) => {
153
217
  return [
154
218
  "'use client';",
155
219
  "",
156
- "// Generated by Amplify UP from your components folder. Do not edit \u2014",
157
- "// add, rename or delete component files instead.",
220
+ "// Generated by Amplify UP from your components folder and installed component",
221
+ "// packages. Do not edit \u2014 add, rename or delete component files instead.",
158
222
  "",
159
223
  "import { defineComponentRegistry, bindAmplifyPage } from '@amplifyup/sdk/react';",
160
224
  ...imports,
@@ -168,7 +232,7 @@ var renderRegistrySource = (entries, outputFile) => {
168
232
  ].join("\n");
169
233
  };
170
234
 
171
- // src/cli/build-registry.ts
235
+ // src/registry/build-registry.ts
172
236
  var LOG_PREFIX = "[Amplify UP]";
173
237
  var WATCH_DEBOUNCE_MS = 120;
174
238
  var writeIfChanged = (file, content) => {
@@ -182,12 +246,37 @@ var ensureSelfIgnored = (outputFile) => {
182
246
  if (path2.basename(dir) !== ".amplifyup") return;
183
247
  writeIfChanged(path2.join(dir, ".gitignore"), "*\n");
184
248
  };
249
+ var describeEntry = (entry, cwd) => entry.module ? `${entry.module} (installed package)` : path2.relative(cwd, entry.file);
250
+ var mergeEntries = (local, packaged, cwd) => {
251
+ const byKey = new Map(local.map((entry) => [entry.key, entry]));
252
+ for (const entry of packaged) {
253
+ const existing = byKey.get(entry.key);
254
+ if (existing) {
255
+ throw new ComponentRegistryError(
256
+ `Two components resolve to the same name "${entry.name}":
257
+ ${describeEntry(existing, cwd)}
258
+ ${describeEntry(entry, cwd)}
259
+ Rename the local component, or remove one of the packages.`
260
+ );
261
+ }
262
+ byKey.set(entry.key, entry);
263
+ }
264
+ return [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));
265
+ };
185
266
  var buildRegistryFromConfig = async (config) => {
186
267
  const scan = await scanComponents(config);
187
- const source = renderRegistrySource(scan.entries, config.outputFile);
268
+ const packages = scanPackages(config.cwd);
269
+ const entries = mergeEntries(scan.entries, packages.entries, config.cwd);
270
+ const source = renderRegistrySource(entries, config.outputFile);
188
271
  const changed = writeIfChanged(config.outputFile, source);
189
272
  ensureSelfIgnored(config.outputFile);
190
- return { ...scan, outputFile: config.outputFile, changed };
273
+ return {
274
+ ...scan,
275
+ entries,
276
+ warnings: packages.warnings,
277
+ outputFile: config.outputFile,
278
+ changed
279
+ };
191
280
  };
192
281
  var buildRegistry = async (cwd) => buildRegistryFromConfig(await loadComponentsConfig(cwd));
193
282
  var reportRegistry = (result, cwd) => {
@@ -195,6 +284,9 @@ var reportRegistry = (result, cwd) => {
195
284
  for (const root of result.missingRoots) {
196
285
  console.warn(`${LOG_PREFIX} Components folder not found: ${rel(root)}`);
197
286
  }
287
+ for (const warning of result.warnings) {
288
+ console.warn(`${LOG_PREFIX} ${warning}`);
289
+ }
198
290
  for (const skip of result.skipped) {
199
291
  console.warn(`${LOG_PREFIX} Skipped ${rel(skip.file)}: ${skip.reason}`);
200
292
  }
@@ -227,7 +319,7 @@ var watchRegistry = async (cwd) => {
227
319
 
228
320
  // src/next.ts
229
321
  var DEV_PHASE = "phase-development-server";
230
- var STATE_KEY = Symbol.for("amplifyup.registryBuild");
322
+ var STATE_KEY = /* @__PURE__ */ Symbol.for("amplifyup.registryBuild");
231
323
  var registryState = () => {
232
324
  const store = globalThis;
233
325
  store[STATE_KEY] ?? (store[STATE_KEY] = {});
package/dist/next.mjs.map CHANGED
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/registry/load-config.ts","../src/component-key.ts","../src/registry/scan-components.ts","../src/registry/scan-packages.ts","../src/registry/render-registry.ts","../src/registry/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 (the package manifest, for package components). */\n file: string;\n /** `default`, or the named export that is the component. */\n exportName: string;\n /** Package to import from, for components shipped by an installed package. */\n module?: 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 { existsSync, readFileSync } from 'fs';\nimport path from 'path';\nimport semver from 'semver';\nimport { componentKey } from '../component-key';\nimport type { RegistryEntry } from './scan-components';\n\nconst SDK_PACKAGE = '@amplifyup/sdk';\n\ntype PackageJson = {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n amplifyup?: { manifest?: string };\n};\n\ntype ManifestComponent = {\n component_id?: unknown;\n export_name?: unknown;\n};\n\ntype PackageManifestFile = {\n components?: ManifestComponent[];\n};\n\nexport type PackageScanResult = {\n entries: RegistryEntry[];\n warnings: string[];\n};\n\nconst readJson = <T>(file: string): T => JSON.parse(readFileSync(file, 'utf8')) as T;\n\n/** Installed copy of a dependency, found the way Node resolves it (walking up node_modules). */\nconst findInstalledPackage = (cwd: string, name: string): string | null => {\n let dir = cwd;\n\n while (true) {\n const candidate = path.join(dir, 'node_modules', name, 'package.json');\n if (existsSync(candidate)) return candidate;\n\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n};\n\nconst peerWarning = (pkg: PackageJson, sdkVersion: string | undefined): string | null => {\n const range = pkg.peerDependencies?.[SDK_PACKAGE];\n if (!range || !sdkVersion) return null;\n if (semver.satisfies(sdkVersion, range, { includePrerelease: true })) return null;\n\n return `${pkg.name} expects ${SDK_PACKAGE} ${range}, but ${sdkVersion} is installed. Update one of them.`;\n};\n\nconst manifestEntries = (\n dependency: string,\n manifestFile: string,\n warnings: string[]\n): RegistryEntry[] => {\n const manifest = readJson<PackageManifestFile>(manifestFile);\n const entries: RegistryEntry[] = [];\n\n for (const component of manifest.components ?? []) {\n const { component_id: id, export_name: exportName } = component;\n if (typeof id !== 'string' || typeof exportName !== 'string') {\n warnings.push(`${dependency}: skipped a manifest component without component_id and export_name`);\n continue;\n }\n\n entries.push({\n name: id,\n key: componentKey(id),\n file: manifestFile,\n exportName,\n module: dependency,\n });\n }\n\n return entries;\n};\n\n/**\n * Components shipped by the site's direct dependencies. A package opts in with\n * `\"amplifyup\": { \"manifest\": \"./dist/amplifyup.manifest.json\" }` in its package.json.\n */\nexport const scanPackages = (cwd: string): PackageScanResult => {\n const siteManifest = path.join(cwd, 'package.json');\n if (!existsSync(siteManifest)) return { entries: [], warnings: [] };\n\n const site = readJson<PackageJson>(siteManifest);\n const dependencies = Object.keys({ ...site.devDependencies, ...site.dependencies }).sort();\n const sdkPackageFile = findInstalledPackage(cwd, SDK_PACKAGE);\n const sdkVersion = sdkPackageFile ? readJson<PackageJson>(sdkPackageFile).version : undefined;\n\n const entries: RegistryEntry[] = [];\n const warnings: string[] = [];\n\n for (const dependency of dependencies) {\n const packageFile = findInstalledPackage(cwd, dependency);\n if (!packageFile) continue;\n\n const pkg = readJson<PackageJson>(packageFile);\n const manifestPath = pkg.amplifyup?.manifest;\n if (!manifestPath) continue;\n\n const manifestFile = path.resolve(path.dirname(packageFile), manifestPath);\n if (!existsSync(manifestFile)) {\n warnings.push(`${dependency}: component manifest not found at ${manifestPath}`);\n continue;\n }\n\n const warning = peerWarning(pkg, sdkVersion);\n if (warning) warnings.push(warning);\n\n entries.push(...manifestEntries(dependency, manifestFile, warnings));\n }\n\n return { entries, warnings };\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(entry.module ?? 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 and installed component',\n '// packages. Do not edit — 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 { ComponentRegistryError, scanComponents, type RegistryEntry, type ScanResult } from './scan-components';\nimport { scanPackages } from './scan-packages';\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 /** Problems with installed component packages; the build still succeeds. */\n warnings: 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\nconst describeEntry = (entry: RegistryEntry, cwd: string): string =>\n entry.module ? `${entry.module} (installed package)` : path.relative(cwd, entry.file);\n\n/** Local components plus installed package components; one name may only resolve once. */\nconst mergeEntries = (\n local: RegistryEntry[],\n packaged: RegistryEntry[],\n cwd: string\n): RegistryEntry[] => {\n const byKey = new Map(local.map((entry) => [entry.key, entry]));\n\n for (const entry of packaged) {\n const existing = byKey.get(entry.key);\n if (existing) {\n throw new ComponentRegistryError(\n `Two components resolve to the same name \"${entry.name}\":\\n` +\n ` ${describeEntry(existing, cwd)}\\n` +\n ` ${describeEntry(entry, cwd)}\\n` +\n 'Rename the local component, or remove one of the packages.'\n );\n }\n byKey.set(entry.key, entry);\n }\n\n return [...byKey.values()].sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport const buildRegistryFromConfig = async (\n config: ResolvedComponentsConfig\n): Promise<BuildRegistryResult> => {\n const scan = await scanComponents(config);\n const packages = scanPackages(config.cwd);\n const entries = mergeEntries(scan.entries, packages.entries, config.cwd);\n const source = renderRegistrySource(entries, config.outputFile);\n\n const changed = writeIfChanged(config.outputFile, source);\n ensureSelfIgnored(config.outputFile);\n\n return {\n ...scan,\n entries,\n warnings: packages.warnings,\n outputFile: config.outputFile,\n changed,\n };\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 warning of result.warnings) {\n console.warn(`${LOG_PREFIX} ${warning}`);\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 './registry/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"]}