@mohasinac/appkit 4.14.0 → 4.15.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/dist/_internal/server/features/auctions/actions.js +2 -2
- package/dist/_internal/server/features/cart/service.d.ts +3 -3
- package/dist/_internal/server/features/checkout/actions.js +19 -0
- package/dist/_internal/server/features/checkout/source-context.d.ts +5 -0
- package/dist/_internal/server/features/checkout/source-context.js +157 -0
- package/dist/_internal/server/features/offers/adapters.d.ts +103 -0
- package/dist/_internal/server/features/offers/adapters.js +88 -0
- package/dist/_internal/server/features/offers/index.d.ts +2 -0
- package/dist/_internal/server/features/offers/index.js +1 -0
- package/dist/_internal/server/features/orders/adapters.js +24 -0
- package/dist/_internal/server/jobs/core/offerExpiry.js +10 -10
- package/dist/_internal/shared/actions/action-registry.js +3 -1
- package/dist/_internal/shared/features/auctions/schema.d.ts +14 -2
- package/dist/_internal/shared/features/auctions/schema.js +13 -1
- package/dist/_internal/shared/features/cart/schema.d.ts +14 -9
- package/dist/_internal/shared/features/cart/schema.js +15 -0
- package/dist/_internal/shared/features/products/schema.d.ts +2 -2
- package/dist/_internal/shared/history/history.d.ts +22 -0
- package/dist/_internal/shared/history/history.js +41 -1
- package/dist/client.d.ts +13 -2
- package/dist/client.js +20 -2
- package/dist/constants/field-names.d.ts +8 -6
- package/dist/constants/field-names.js +48 -6
- package/dist/features/account/components/UserBidsView.js +12 -4
- package/dist/features/account/components/UserReturnsView.d.ts +3 -0
- package/dist/features/account/components/UserReturnsView.js +17 -1
- package/dist/features/admin/components/AdminAuditLogView.js +1 -0
- package/dist/features/admin/components/AdminBidsView.js +15 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +65 -33
- package/dist/features/admin/components/AdminFeatureEditorView.js +35 -6
- package/dist/features/admin/components/AdminNavEditorView.js +15 -5
- package/dist/features/admin/components/AdminNewsletterView.js +18 -2
- package/dist/features/admin/components/AdminOffersView.js +62 -18
- package/dist/features/admin/components/AdminPaymentMethodsView.js +24 -4
- package/dist/features/admin/components/AdminScammerEditorView.d.ts +2 -1
- package/dist/features/admin/components/AdminScammerEditorView.js +3 -13
- package/dist/features/admin/components/AdminScammersView.js +3 -8
- package/dist/features/admin/components/AdminSectionsView.js +32 -23
- package/dist/features/admin/components/AdminSessionsView.js +17 -2
- package/dist/features/admin/components/ViewAuditLogEntryModal.js +1 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -2
- package/dist/features/admin/components/sections/adminSectionsTypes.js +45 -27
- package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
- package/dist/features/admin/constants/filter-tabs.js +1 -0
- package/dist/features/admin/schemas/homepage-section-form.d.ts +22 -0
- package/dist/features/admin/schemas/homepage-section-form.js +68 -0
- package/dist/features/admin/schemas/nav-item-form.d.ts +74 -0
- package/dist/features/admin/schemas/nav-item-form.js +72 -0
- package/dist/features/auctions/components/AuctionBidsTable.d.ts +10 -1
- package/dist/features/auctions/components/AuctionBidsTable.js +22 -4
- package/dist/features/auctions/components/bid-detail-fields.d.ts +29 -0
- package/dist/features/auctions/components/bid-detail-fields.js +103 -0
- package/dist/features/audit-log/schemas/firestore.d.ts +14 -0
- package/dist/features/audit-log/schemas/firestore.js +7 -0
- package/dist/features/blog/schemas/blog-form.d.ts +80 -0
- package/dist/features/blog/schemas/blog-form.js +100 -0
- package/dist/features/events/components/AdminEventEditorView.js +32 -54
- package/dist/features/events/components/AdminEventEntriesView.js +22 -3
- package/dist/features/events/schemas/event-form.d.ts +113 -0
- package/dist/features/events/schemas/event-form.js +82 -0
- package/dist/features/grouped/schemas/grouped-listing-form.d.ts +101 -0
- package/dist/features/grouped/schemas/grouped-listing-form.js +89 -0
- package/dist/features/homepage/actions/homepage-section-actions.d.ts +11 -3
- package/dist/features/homepage/actions/homepage-section-actions.js +33 -1
- package/dist/features/homepage/schemas/index.d.ts +31 -0
- package/dist/features/homepage/schemas/index.js +24 -0
- package/dist/features/orders/components/OrderStatusTimeline.d.ts +5 -1
- package/dist/features/orders/components/OrderStatusTimeline.js +39 -20
- package/dist/features/orders/repository/orders.repository.js +5 -0
- package/dist/features/orders/schemas/firestore.d.ts +36 -1
- package/dist/features/orders/types/index.d.ts +35 -7
- package/dist/features/products/components/GroupSettingsPanel.js +5 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/schemas/product-features.validators.d.ts +73 -0
- package/dist/features/products/schemas/product-features.validators.js +63 -0
- package/dist/features/scams/constants/scammer-status-display.d.ts +28 -0
- package/dist/features/scams/constants/scammer-status-display.js +79 -0
- package/dist/features/seller/actions/offer-actions.js +32 -2
- package/dist/features/seller/components/OfferPhaseTimeline.d.ts +59 -0
- package/dist/features/seller/components/OfferPhaseTimeline.js +107 -0
- package/dist/features/seller/components/SellerBidsView.js +11 -4
- package/dist/features/seller/components/SellerCouponEditorView.js +17 -17
- package/dist/features/seller/components/SellerOffersView.js +2 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +38 -14
- package/dist/features/seller/repository/offer.repository.d.ts +69 -8
- package/dist/features/seller/repository/offer.repository.js +127 -23
- package/dist/features/seller/schemas/coupon-form.d.ts +72 -0
- package/dist/features/seller/schemas/coupon-form.js +116 -0
- package/dist/features/seller/schemas/firestore.d.ts +56 -2
- package/dist/features/seller/schemas/firestore.js +27 -0
- package/dist/features/seller/schemas/offer-forms.d.ts +21 -0
- package/dist/features/seller/schemas/offer-forms.js +21 -0
- package/dist/features/shell/build-sections.d.ts +63 -0
- package/dist/features/shell/build-sections.js +207 -0
- package/dist/features/shell/field-ui-meta.d.ts +115 -0
- package/dist/features/shell/field-ui-meta.js +324 -0
- package/dist/features/shell/index.d.ts +4 -0
- package/dist/features/shell/index.js +2 -0
- package/dist/features/status-history/components/StatusTimeline.d.ts +74 -0
- package/dist/features/status-history/components/StatusTimeline.js +46 -0
- package/dist/features/status-history/index.d.ts +11 -0
- package/dist/features/status-history/index.js +10 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.d.ts +27 -0
- package/dist/features/store-extensions/components/ReviewDecisionModal.js +82 -0
- package/dist/features/store-extensions/index.d.ts +12 -0
- package/dist/features/store-extensions/index.js +12 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +36 -0
- package/dist/features/store-extensions/schemas/admin-notification-form.js +114 -0
- package/dist/features/store-extensions/schemas/analytics-forms.d.ts +57 -0
- package/dist/features/store-extensions/schemas/analytics-forms.js +158 -0
- package/dist/features/store-extensions/schemas/custom-role-form.d.ts +85 -0
- package/dist/features/store-extensions/schemas/custom-role-form.js +118 -0
- package/dist/features/store-extensions/schemas/firestore.d.ts +21 -1
- package/dist/features/store-extensions/schemas/firestore.js +60 -0
- package/dist/features/store-extensions/schemas/google-config-form.d.ts +53 -0
- package/dist/features/store-extensions/schemas/google-config-form.js +105 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.d.ts +28 -0
- package/dist/features/store-extensions/schemas/item-request-create-form.js +80 -0
- package/dist/features/store-extensions/schemas/listing-template-form.d.ts +78 -0
- package/dist/features/store-extensions/schemas/listing-template-form.js +87 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.d.ts +49 -0
- package/dist/features/store-extensions/schemas/moderation-review-form.js +101 -0
- package/dist/features/store-extensions/schemas/payout-method-form.d.ts +153 -0
- package/dist/features/store-extensions/schemas/payout-method-form.js +155 -0
- package/dist/features/store-extensions/schemas/report-create-form.d.ts +25 -0
- package/dist/features/store-extensions/schemas/report-create-form.js +79 -0
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +47 -0
- package/dist/features/store-extensions/schemas/report-review-form.js +111 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +148 -0
- package/dist/features/store-extensions/schemas/shipping-config-form.js +104 -0
- package/dist/features/store-extensions/schemas/store-category-form.d.ts +54 -0
- package/dist/features/store-extensions/schemas/store-category-form.js +73 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +326 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.js +12 -2
- package/dist/next/routing/route-map.d.ts +16 -2
- package/dist/next/routing/route-map.js +9 -2
- package/dist/schemas/firestore-value.d.ts +8 -0
- package/dist/schemas/firestore-value.js +44 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/registry.d.ts +634 -1
- package/dist/schemas/registry.js +64 -1
- package/dist/seed/bids-seed-data.js +30 -0
- package/dist/seed/offers-seed-data.js +212 -7
- package/dist/seed/orders-seed-data.js +336 -1
- package/dist/seed/products-auctions-seed-data.js +41 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +5 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/RecordDetailModal.d.ts +10 -1
- package/dist/ui/components/RecordDetailModal.js +2 -2
- package/package.json +2 -1
- package/scripts/node-esm-loader.mjs +65 -0
- package/scripts/seed-cli-loader.mjs +6 -49
- package/scripts/seed-cli.mjs +1 -1
|
@@ -60,9 +60,18 @@ export interface RecordDetailModalProps {
|
|
|
60
60
|
heading: string;
|
|
61
61
|
entries: RecordDetailItem[];
|
|
62
62
|
};
|
|
63
|
+
/**
|
|
64
|
+
* Rich content rendered between `items` and `metadata` — a timeline rail, a
|
|
65
|
+
* chart, anything that is neither a scalar field nor a raw payload.
|
|
66
|
+
*
|
|
67
|
+
* `footer` cannot host this: that slot is an action-button row wrapped in
|
|
68
|
+
* `<Row justify="end">`, so a full-width block placed there is squeezed to
|
|
69
|
+
* the right and reads as a control.
|
|
70
|
+
*/
|
|
71
|
+
extra?: ReactNode;
|
|
63
72
|
/** Raw payload dump for records that carry an open-ended object. */
|
|
64
73
|
metadata?: Record<string, JsonValue>;
|
|
65
74
|
/** Action buttons rendered at the bottom (approve/reject/etc). */
|
|
66
75
|
footer?: ReactNode;
|
|
67
76
|
}
|
|
68
|
-
export declare function RecordDetailModal({ isOpen, onClose, title, badges, description, fields, items, metadata, footer, }: RecordDetailModalProps): import("react").JSX.Element;
|
|
77
|
+
export declare function RecordDetailModal({ isOpen, onClose, title, badges, description, fields, items, extra, metadata, footer, }: RecordDetailModalProps): import("react").JSX.Element;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Anchor, Badge, Code, Div, Modal, Row, Stack, Text } from "../index";
|
|
4
4
|
import { MediaImage } from "../../features/media/MediaImage";
|
|
5
|
-
export function RecordDetailModal({ isOpen, onClose, title, badges, description, fields, items, metadata, footer, }) {
|
|
5
|
+
export function RecordDetailModal({ isOpen, onClose, title, badges, description, fields, items, extra, metadata, footer, }) {
|
|
6
6
|
const hasMetadata = Boolean(metadata && Object.keys(metadata).length > 0);
|
|
7
|
-
return (_jsx(Modal, { isOpen: isOpen, onClose: onClose, title: title, children: _jsxs(Stack, { gap: "md", children: [badges && badges.length > 0 && (_jsx(Row, { gap: "sm", align: "center", wrap: true, children: badges.map((b) => (_jsx(Badge, { variant: b.variant ?? "default", children: b.label }, b.label))) })), description && (_jsx(Div, { rounded: "lg", padding: "sm", surface: "muted", border: "default", children: _jsx(Text, { size: "sm", children: description }) })), fields && fields.length > 0 && (_jsx(Stack, { gap: "xs", children: fields.map((f) => (_jsxs(Row, { justify: "between", gap: "md", children: [_jsx(Text, { size: "sm", color: "muted", children: f.label }), _jsx(Text, { size: "sm", weight: "medium", className: "text-right", children: f.value })] }, f.label))) })), items && items.entries.length > 0 && (_jsxs(Stack, { gap: "xs", children: [_jsxs(Text, { size: "xs", weight: "semibold", color: "muted", children: [items.heading, " (", items.entries.length, ")"] }), _jsx(Div, { className: "divide-y divide-[var(--appkit-color-border)] border border-[var(--appkit-color-border)]", rounded: "lg", children: items.entries.map((entry, i) => (_jsxs(Row, { gap: "sm", align: "center", justify: "between", paddingY: "y-xs-tall", padding: "x-sm", children: [_jsxs(Row, { gap: "sm", align: "center", className: "min-w-0", children: [_jsx(Div, { className: "h-10 w-10 shrink-0", rounded: "md", overflow: "hidden", children: _jsx(MediaImage, { src: entry.image, alt: entry.title, size: "thumbnail" }) }), _jsxs(Stack, { gap: "none", className: "min-w-0", children: [entry.href ? (_jsx(Anchor, { href: entry.href, tone: "brand", size: "sm", weight: "medium", children: entry.title })) : (_jsx(Text, { size: "sm", weight: "medium", className: "truncate", children: entry.title })), entry.subtitle && (_jsx(Text, { size: "xs", color: "muted", children: entry.subtitle }))] })] }), entry.trailing && (_jsx(Text, { size: "sm", weight: "medium", className: "shrink-0", children: entry.trailing }))] }, `${entry.title}-${i}`))) })] })), hasMetadata && (_jsxs(Div, { rounded: "lg", padding: "sm", surface: "muted", border: "default", children: [_jsx(Text, { size: "xs", weight: "semibold", color: "muted", className: "mb-1", children: "Details" }), _jsx(Code, { size: "xs", className: "block whitespace-pre-wrap font-mono", children: JSON.stringify(metadata, null, 2) })] })), footer && _jsx(Row, { justify: "end", gap: "sm", children: footer })] }) }));
|
|
7
|
+
return (_jsx(Modal, { isOpen: isOpen, onClose: onClose, title: title, children: _jsxs(Stack, { gap: "md", children: [badges && badges.length > 0 && (_jsx(Row, { gap: "sm", align: "center", wrap: true, children: badges.map((b) => (_jsx(Badge, { variant: b.variant ?? "default", children: b.label }, b.label))) })), description && (_jsx(Div, { rounded: "lg", padding: "sm", surface: "muted", border: "default", children: _jsx(Text, { size: "sm", children: description }) })), fields && fields.length > 0 && (_jsx(Stack, { gap: "xs", children: fields.map((f) => (_jsxs(Row, { justify: "between", gap: "md", children: [_jsx(Text, { size: "sm", color: "muted", children: f.label }), _jsx(Text, { size: "sm", weight: "medium", className: "text-right", children: f.value })] }, f.label))) })), items && items.entries.length > 0 && (_jsxs(Stack, { gap: "xs", children: [_jsxs(Text, { size: "xs", weight: "semibold", color: "muted", children: [items.heading, " (", items.entries.length, ")"] }), _jsx(Div, { className: "divide-y divide-[var(--appkit-color-border)] border border-[var(--appkit-color-border)]", rounded: "lg", children: items.entries.map((entry, i) => (_jsxs(Row, { gap: "sm", align: "center", justify: "between", paddingY: "y-xs-tall", padding: "x-sm", children: [_jsxs(Row, { gap: "sm", align: "center", className: "min-w-0", children: [_jsx(Div, { className: "h-10 w-10 shrink-0", rounded: "md", overflow: "hidden", children: _jsx(MediaImage, { src: entry.image, alt: entry.title, size: "thumbnail" }) }), _jsxs(Stack, { gap: "none", className: "min-w-0", children: [entry.href ? (_jsx(Anchor, { href: entry.href, tone: "brand", size: "sm", weight: "medium", children: entry.title })) : (_jsx(Text, { size: "sm", weight: "medium", className: "truncate", children: entry.title })), entry.subtitle && (_jsx(Text, { size: "xs", color: "muted", children: entry.subtitle }))] })] }), entry.trailing && (_jsx(Text, { size: "sm", weight: "medium", className: "shrink-0", children: entry.trailing }))] }, `${entry.title}-${i}`))) })] })), extra, hasMetadata && (_jsxs(Div, { rounded: "lg", padding: "sm", surface: "muted", border: "default", children: [_jsx(Text, { size: "xs", weight: "semibold", color: "muted", className: "mb-1", children: "Details" }), _jsx(Code, { size: "xs", className: "block whitespace-pre-wrap font-mono", children: JSON.stringify(metadata, null, 2) })] })), footer && _jsx(Row, { justify: "end", gap: "sm", children: footer })] }) }));
|
|
8
8
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mohasinac/appkit",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.15.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
"scripts/init-config.mjs",
|
|
129
129
|
"scripts/labels-extract.mjs",
|
|
130
130
|
"scripts/seed-cli.mjs",
|
|
131
|
+
"scripts/node-esm-loader.mjs",
|
|
131
132
|
"scripts/seed-cli-loader.mjs",
|
|
132
133
|
"scripts/dedupe-peer-deps.mjs",
|
|
133
134
|
"scripts/copy-assets.mjs",
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESM resolver hook — makes `import("@mohasinac/appkit")` work from ANY
|
|
3
|
+
* standalone Node script.
|
|
4
|
+
*
|
|
5
|
+
* appkit is `"type": "module"` built by plain `tsc`, and tsc does not rewrite
|
|
6
|
+
* import specifiers — so all ~2,190 emitted `.js` files carry bare relative
|
|
7
|
+
* imports with no `.js` extension. Bundlers (Next/Turbopack, tsup, vite)
|
|
8
|
+
* resolve those happily; Node's ESM resolver refuses them outright. This hook
|
|
9
|
+
* retries with `.js` and then `/index.js` on ERR_MODULE_NOT_FOUND, and stubs
|
|
10
|
+
* the two other things that make a raw Node import of appkit explode.
|
|
11
|
+
*
|
|
12
|
+
* Registered by:
|
|
13
|
+
* - `appkit/scripts/seed-cli.mjs` (the appkit-seed CLI)
|
|
14
|
+
* - `scripts/qa/roundtrip-diff.mjs` (the schema field-loss gate)
|
|
15
|
+
*
|
|
16
|
+
* **Renamed from `seed-cli-loader.mjs`** — it was never seed-specific, and
|
|
17
|
+
* that name was why a later session diagnosed the same ESM failure from
|
|
18
|
+
* scratch and concluded the fix was to rewrite every specifier at build time.
|
|
19
|
+
* It is not: it is this file, registered in three lines. `seed-cli-loader.mjs`
|
|
20
|
+
* remains as a re-export so any pinned path keeps working.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
// Stub out non-JS asset imports (CSS, etc.) — appkit's dist contains
|
|
24
|
+
// `import "./foo.css"` side-effect statements that Node ESM can't load.
|
|
25
|
+
const STUB_EXTENSIONS = [".css", ".scss", ".sass", ".png", ".jpg", ".jpeg", ".svg", ".webp", ".gif"];
|
|
26
|
+
|
|
27
|
+
// server-only / client-only are Next.js-specific sentinel packages — their
|
|
28
|
+
// entire module body unconditionally throws, because their whole purpose is
|
|
29
|
+
// a Next.js-compiler-time + Next.js-runtime guard against importing a
|
|
30
|
+
// server-only (or client-only) module from the wrong side of the boundary.
|
|
31
|
+
// A raw Node script (this CLI) is neither a Next.js Server Component nor a
|
|
32
|
+
// Client Component, so the guard is meaningless here — the main
|
|
33
|
+
// @mohasinac/appkit barrel transitively reaches a module (e.g.
|
|
34
|
+
// features/contact/email.tsx) that imports "server-only" at the top level,
|
|
35
|
+
// which crashes the whole CLI on load. Stub both to a no-op module. Found
|
|
36
|
+
// 2026-08-17 debugging the CLI seed tool being unable to import appkit at all.
|
|
37
|
+
const SENTINEL_SPECIFIERS = new Set(["server-only", "client-only"]);
|
|
38
|
+
|
|
39
|
+
export async function load(url, context, nextLoad) {
|
|
40
|
+
if (STUB_EXTENSIONS.some((ext) => url.endsWith(ext))) {
|
|
41
|
+
return { format: "module", shortCircuit: true, source: "export default undefined;" };
|
|
42
|
+
}
|
|
43
|
+
return nextLoad(url, context);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function resolve(specifier, context, nextResolve) {
|
|
47
|
+
if (SENTINEL_SPECIFIERS.has(specifier)) {
|
|
48
|
+
return { url: `data:text/javascript,export default undefined;`, shortCircuit: true };
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
return await nextResolve(specifier, context);
|
|
52
|
+
} catch (err) {
|
|
53
|
+
if (err?.code !== "ERR_MODULE_NOT_FOUND" && err?.code !== "ERR_UNSUPPORTED_DIR_IMPORT") throw err;
|
|
54
|
+
if (specifier.endsWith(".js") || specifier.endsWith(".mjs") || specifier.endsWith(".cjs")) throw err;
|
|
55
|
+
// Try with .js suffix (most common case)
|
|
56
|
+
try {
|
|
57
|
+
return await nextResolve(`${specifier}.js`, context);
|
|
58
|
+
} catch {}
|
|
59
|
+
// Try as a directory index
|
|
60
|
+
try {
|
|
61
|
+
return await nextResolve(`${specifier}/index.js`, context);
|
|
62
|
+
} catch {}
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -1,52 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Back-compat shim. The real implementation is `node-esm-loader.mjs`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* The hook was never seed-specific — it makes a bare `import("@mohasinac/appkit")`
|
|
5
|
+
* resolve from any standalone Node script — so it was renamed. This file stays
|
|
6
|
+
* so a pinned path (a published tarball, a script outside this repo) keeps
|
|
7
|
+
* working. Register `node-esm-loader.mjs` directly in anything new.
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
// Stub out non-JS asset imports (CSS, etc.) — appkit's dist contains
|
|
11
|
-
// `import "./foo.css"` side-effect statements that Node ESM can't load.
|
|
12
|
-
const STUB_EXTENSIONS = [".css", ".scss", ".sass", ".png", ".jpg", ".jpeg", ".svg", ".webp", ".gif"];
|
|
13
|
-
|
|
14
|
-
// server-only / client-only are Next.js-specific sentinel packages — their
|
|
15
|
-
// entire module body unconditionally throws, because their whole purpose is
|
|
16
|
-
// a Next.js-compiler-time + Next.js-runtime guard against importing a
|
|
17
|
-
// server-only (or client-only) module from the wrong side of the boundary.
|
|
18
|
-
// A raw Node script (this CLI) is neither a Next.js Server Component nor a
|
|
19
|
-
// Client Component, so the guard is meaningless here — the main
|
|
20
|
-
// @mohasinac/appkit barrel transitively reaches a module (e.g.
|
|
21
|
-
// features/contact/email.tsx) that imports "server-only" at the top level,
|
|
22
|
-
// which crashes the whole CLI on load. Stub both to a no-op module. Found
|
|
23
|
-
// 2026-08-17 debugging the CLI seed tool being unable to import appkit at all.
|
|
24
|
-
const SENTINEL_SPECIFIERS = new Set(["server-only", "client-only"]);
|
|
25
|
-
|
|
26
|
-
export async function load(url, context, nextLoad) {
|
|
27
|
-
if (STUB_EXTENSIONS.some((ext) => url.endsWith(ext))) {
|
|
28
|
-
return { format: "module", shortCircuit: true, source: "export default undefined;" };
|
|
29
|
-
}
|
|
30
|
-
return nextLoad(url, context);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export async function resolve(specifier, context, nextResolve) {
|
|
34
|
-
if (SENTINEL_SPECIFIERS.has(specifier)) {
|
|
35
|
-
return { url: `data:text/javascript,export default undefined;`, shortCircuit: true };
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
return await nextResolve(specifier, context);
|
|
39
|
-
} catch (err) {
|
|
40
|
-
if (err?.code !== "ERR_MODULE_NOT_FOUND" && err?.code !== "ERR_UNSUPPORTED_DIR_IMPORT") throw err;
|
|
41
|
-
if (specifier.endsWith(".js") || specifier.endsWith(".mjs") || specifier.endsWith(".cjs")) throw err;
|
|
42
|
-
// Try with .js suffix (most common case)
|
|
43
|
-
try {
|
|
44
|
-
return await nextResolve(`${specifier}.js`, context);
|
|
45
|
-
} catch {}
|
|
46
|
-
// Try as a directory index
|
|
47
|
-
try {
|
|
48
|
-
return await nextResolve(`${specifier}/index.js`, context);
|
|
49
|
-
} catch {}
|
|
50
|
-
throw err;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
9
|
+
export { load, resolve } from "./node-esm-loader.mjs";
|
package/scripts/seed-cli.mjs
CHANGED
|
@@ -34,7 +34,7 @@ import readline from "node:readline";
|
|
|
34
34
|
// Register an ESM resolver hook that retries with `.js` / `/index.js` when
|
|
35
35
|
// appkit's bundler-target dist emits extension-less relative imports.
|
|
36
36
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
37
|
-
register("./
|
|
37
|
+
register("./node-esm-loader.mjs", pathToFileURL(__dirname + "/"));
|
|
38
38
|
|
|
39
39
|
// ---------------------------------------------------------------------------
|
|
40
40
|
// CLI parsing — entry point detects bin name so the same script powers
|