@pantheon-systems/p1-next-sdk 0.7.0 → 0.10.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 (56) hide show
  1. package/README.md +87 -0
  2. package/bin/lib/cli.js +171 -0
  3. package/bin/lib/detect.js +179 -0
  4. package/bin/lib/fs-ops.js +32 -0
  5. package/bin/lib/git.js +60 -0
  6. package/bin/lib/messages.js +65 -0
  7. package/bin/lib/transform.js +155 -0
  8. package/bin/p1-migrate.js +5 -0
  9. package/dist/P1NextRouterProvider.d.ts +1 -1
  10. package/dist/P1NextRouterProvider.d.ts.map +1 -1
  11. package/dist/auth-handler.d.ts.map +1 -1
  12. package/dist/auth-handler.js +7 -2
  13. package/dist/auth-handler.js.map +1 -1
  14. package/dist/auth-utils.d.ts +2 -0
  15. package/dist/auth-utils.d.ts.map +1 -0
  16. package/dist/auth-utils.js +7 -0
  17. package/dist/auth-utils.js.map +1 -0
  18. package/dist/css-query-fetchers.d.ts +8 -0
  19. package/dist/css-query-fetchers.d.ts.map +1 -0
  20. package/dist/css-query-fetchers.js +48 -0
  21. package/dist/css-query-fetchers.js.map +1 -0
  22. package/dist/editor-paths.d.ts +10 -0
  23. package/dist/editor-paths.d.ts.map +1 -0
  24. package/dist/editor-paths.js +38 -0
  25. package/dist/editor-paths.js.map +1 -0
  26. package/dist/handler.d.ts.map +1 -1
  27. package/dist/handler.js +1 -7
  28. package/dist/handler.js.map +1 -1
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/middleware.d.ts +8 -0
  34. package/dist/middleware.d.ts.map +1 -0
  35. package/dist/middleware.js +46 -0
  36. package/dist/middleware.js.map +1 -0
  37. package/dist/pages-handler.d.ts +44 -14
  38. package/dist/pages-handler.d.ts.map +1 -1
  39. package/dist/pages-handler.js +31 -23
  40. package/dist/pages-handler.js.map +1 -1
  41. package/dist/routes/broker.d.ts.map +1 -1
  42. package/dist/routes/broker.js +79 -9
  43. package/dist/routes/broker.js.map +1 -1
  44. package/dist/routes/datasource-context.d.ts.map +1 -1
  45. package/dist/routes/datasource-context.js +15 -3
  46. package/dist/routes/datasource-context.js.map +1 -1
  47. package/dist/routes/editor-context.d.ts.map +1 -1
  48. package/dist/routes/editor-context.js +39 -2
  49. package/dist/routes/editor-context.js.map +1 -1
  50. package/dist/routes/resolve-preview.js +1 -1
  51. package/dist/routes/resolve-preview.js.map +1 -1
  52. package/dist/server.d.ts +2 -0
  53. package/dist/server.d.ts.map +1 -1
  54. package/dist/server.js +2 -0
  55. package/dist/server.js.map +1 -1
  56. package/package.json +15 -10
@@ -1,35 +1,43 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { pagePathFromCatchAllSegments, ensureInitialized, } from "@pantheon-systems/puck-css/server";
3
- function parsePath(path) {
4
- if (path.length === 0)
5
- return { pagePath: "/" };
6
- const command = path[0];
7
- // /p1/api/... is handled by the route handler, not the page
8
- if (command === "api")
9
- return { pagePath: "/" };
10
- // /p1/edit/... -> editor for the path
11
- if (command === "edit") {
12
- const rest = path.slice(1);
13
- return { pagePath: pagePathFromCatchAllSegments(rest) };
14
- }
15
- // /p1/... (anything else) -> editor for that path
16
- return { pagePath: pagePathFromCatchAllSegments(path) };
17
- }
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ensureInitialized, } from "@pantheon-systems/puck-css/server";
3
+ import { parseEditorSegments } from "./editor-paths";
18
4
  export function createP1Pages(opts) {
19
5
  const { EditorClient } = opts;
20
6
  const initPromise = ensureInitialized(opts);
7
+ // A parent layout always renders before its child page within a request, so
8
+ // if the editor is mounted correctly Layout flips this before Page reads it.
9
+ // A legacy page-only app (no `(editor)/layout.tsx`) renders Page alone, and
10
+ // the flag is still false — the dev-only nudge below fires. Per-process,
11
+ // best-effort: it can't run in production and never affects output.
12
+ let layoutRendered = false;
13
+ let warnedMissingLayout = false;
21
14
  async function generateMetadata({ params, }) {
22
15
  await initPromise;
23
16
  const { p1 = [] } = await params;
24
- const { pagePath } = parsePath(p1);
17
+ const pagePath = parseEditorSegments(p1);
25
18
  return { title: "P1 Editor: " + pagePath };
26
19
  }
27
- async function Page({ params, }) {
20
+ // Persists across route-param changes — the editor lives here. Sets the flag
21
+ // synchronously (before any await) so Page can observe it in the same request.
22
+ async function Layout({ children }) {
23
+ layoutRendered = true;
28
24
  await initPromise;
29
- const { p1 = [] } = await params;
30
- const { pagePath } = parsePath(p1);
31
- return _jsx(EditorClient, { path: pagePath });
25
+ return (_jsxs(_Fragment, { children: [_jsx(EditorClient, {}), children] }));
26
+ }
27
+ // Remounts per navigation; must stay empty so nothing is lost when it does.
28
+ function Page() {
29
+ if (process.env.NODE_ENV !== "production" &&
30
+ !layoutRendered &&
31
+ !warnedMissingLayout) {
32
+ warnedMissingLayout = true;
33
+ console.warn("[p1-next-sdk] The P1 editor now renders from pages.Layout, but this " +
34
+ "app rendered pages.Page without it — the editor will be empty. Mount " +
35
+ "it at app/p1/(editor)/layout.tsx, or run: " +
36
+ "npx @pantheon-systems/p1-next-sdk p1-migrate — see " +
37
+ "docs/MIGRATION-EDITOR-LAYOUT.md");
38
+ }
39
+ return null;
32
40
  }
33
- return { Page, generateMetadata };
41
+ return { Page, Layout, generateMetadata };
34
42
  }
35
43
  //# sourceMappingURL=pages-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pages-handler.js","sourceRoot":"","sources":["../src/pages-handler.tsx"],"names":[],"mappings":";AAgBA,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,GAElB,MAAM,mCAAmC,CAAC;AAU3C,SAAS,SAAS,CAAC,IAAc;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,4DAA4D;IAC5D,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAEhD,sCAAsC;IACtC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,EAAE,QAAQ,EAAE,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,kDAAkD;IAClD,OAAO,EAAE,QAAQ,EAAE,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAmB;IAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE5C,KAAK,UAAU,gBAAgB,CAAC,EAC9B,MAAM,GAGP;QACC,MAAM,WAAW,CAAC;QAClB,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC;QACjC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,aAAa,GAAG,QAAQ,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,UAAU,IAAI,CAAC,EAClB,MAAM,GAGP;QACC,MAAM,WAAW,CAAC;QAClB,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC;QACjC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAEnC,OAAO,KAAC,YAAY,IAAC,IAAI,EAAE,QAAQ,GAAI,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"pages-handler.js","sourceRoot":"","sources":["../src/pages-handler.tsx"],"names":[],"mappings":";AA4CA,OAAO,EACL,iBAAiB,GAElB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAarD,MAAM,UAAU,aAAa,CAAC,IAAmB;IAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE5C,4EAA4E;IAC5E,6EAA6E;IAC7E,4EAA4E;IAC5E,yEAAyE;IACzE,oEAAoE;IACpE,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,KAAK,UAAU,gBAAgB,CAAC,EAC9B,MAAM,GAGP;QACC,MAAM,WAAW,CAAC;QAClB,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC;QACjC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,KAAK,EAAE,aAAa,GAAG,QAAQ,EAAE,CAAC;IAC7C,CAAC;IAED,6EAA6E;IAC7E,+EAA+E;IAC/E,KAAK,UAAU,MAAM,CAAC,EAAE,QAAQ,EAAiC;QAC/D,cAAc,GAAG,IAAI,CAAC;QACtB,MAAM,WAAW,CAAC;QAClB,OAAO,CACL,8BACE,KAAC,YAAY,KAAG,EACf,QAAQ,IACR,CACJ,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,SAAS,IAAI;QACX,IACE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACrC,CAAC,cAAc;YACf,CAAC,mBAAmB,EACpB,CAAC;YACD,mBAAmB,GAAG,IAAI,CAAC;YAC3B,OAAO,CAAC,IAAI,CACV,sEAAsE;gBACpE,uEAAuE;gBACvE,4CAA4C;gBAC5C,qDAAqD;gBACrD,iCAAiC,CACpC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;AAC5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../src/routes/broker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,8BAkDhB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,8BA0C5B"}
1
+ {"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../src/routes/broker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsB3C,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,8BA+EhB;AA6BD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,8BA0C5B"}
@@ -1,4 +1,23 @@
1
1
  import { NextResponse } from "next/server";
2
+ // Route Handler `request.url` reflects the Node server's own bind address
3
+ // (e.g. localhost:3000), not the Host the browser actually requested, once a
4
+ // reverse proxy is involved -- but its scheme is unaffected by that, so only
5
+ // the host needs replacing.
6
+ //
7
+ // Deliberately reads `host`, NOT `x-forwarded-host`: on Pantheon, `Host` is
8
+ // what the edge routes on, so a request only reaches this container with a
9
+ // Host that resolves to this site -- an arbitrary Host 404s upstream.
10
+ // `X-Forwarded-Host` is not similarly validated; it passes through from the
11
+ // client unchanged, so trusting it here would let anyone redirect a login
12
+ // to an attacker-controlled origin (confirmed empirically, not theoretical).
13
+ function deriveOriginFromRequest(request) {
14
+ const host = request.headers.get("host");
15
+ const requestUrl = new URL(request.url);
16
+ if (host === null) {
17
+ return requestUrl.origin;
18
+ }
19
+ return `${requestUrl.protocol}//${host}`;
20
+ }
2
21
  export async function postBrokerLogin(request, apiKey, baseUrl, siteUrl, redirectUrl, prompt) {
3
22
  if (!apiKey || !baseUrl) {
4
23
  return NextResponse.json({ error: "Server configuration error" }, { status: 500 });
@@ -13,18 +32,37 @@ export async function postBrokerLogin(request, apiKey, baseUrl, siteUrl, redirec
13
32
  const requestUrl = new URL(request.url);
14
33
  const basePath = requestUrl.pathname.replace(/\/auth\/.*$/, '') || '/';
15
34
  const siteUrlValue = siteUrl ?? process.env.P1_SITE_URL;
16
- if (!siteUrlValue && process.env.NODE_ENV === 'production') {
17
- console.warn("[P1AuthHandler] p1SiteUrl is not set. Redirect URLs may be incorrect behind a reverse proxy. " +
18
- "Set the P1_SITE_URL environment variable or pass p1SiteUrl in your P1AuthHandlerConfig. " +
19
- "This will be required in a future major version.");
20
- }
21
- const actualOrigin = siteUrlValue
22
- ? new URL(siteUrlValue).origin
23
- : requestUrl.origin;
35
+ const derivedOrigin = deriveOriginFromRequest(request);
36
+ if (!siteUrlValue && derivedOrigin === requestUrl.origin && process.env.NODE_ENV === 'production') {
37
+ console.warn("[P1AuthHandler] p1SiteUrl is not set and no Host header was present. " +
38
+ "Redirect URLs may be incorrect behind a reverse proxy. " +
39
+ "Set the P1_SITE_URL environment variable or pass p1SiteUrl in your P1AuthHandlerConfig.");
40
+ }
41
+ let actualOrigin = derivedOrigin;
42
+ if (siteUrlValue) {
43
+ try {
44
+ actualOrigin = new URL(siteUrlValue).origin;
45
+ }
46
+ catch {
47
+ console.warn(`[P1AuthHandler] P1_SITE_URL/p1SiteUrl ("${siteUrlValue}") is not a valid URL; ` +
48
+ "falling back to the request's own origin.");
49
+ }
50
+ }
24
51
  const effectiveRedirectUrl = redirectUrl ?? actualOrigin + basePath;
52
+ // PCC-3531: the fallback above yields localhost on a deployed site because this
53
+ // server cannot see its own public origin. The browser can, so pass its origin
54
+ // upstream as a proposal for CCR to validate. Skipped when a target is
55
+ // configured, keeping those requests byte-identical to before.
56
+ const hasExplicitTarget = redirectUrl !== undefined || siteUrlValue !== undefined;
57
+ const proposedOrigin = hasExplicitTarget
58
+ ? undefined
59
+ : await readProposedOrigin(request);
25
60
  headers["Content-Type"] = "application/json";
26
61
  fetchInit.body = JSON.stringify({
27
62
  redirectUrl: effectiveRedirectUrl,
63
+ ...(proposedOrigin !== undefined
64
+ ? { proposedRedirectUrl: proposedOrigin + basePath }
65
+ : {}),
28
66
  ...(prompt !== undefined ? { prompt } : {}),
29
67
  });
30
68
  const response = await fetch(`${baseUrl}/broker/login`, fetchInit);
@@ -32,7 +70,39 @@ export async function postBrokerLogin(request, apiKey, baseUrl, siteUrl, redirec
32
70
  if (!response.ok) {
33
71
  return NextResponse.json(body, { status: response.status });
34
72
  }
35
- return NextResponse.json(body);
73
+ // Log then strip: this route is public, so echoing the warning would let anyone
74
+ // probe whether an origin is registered for a site. The browser never reads it.
75
+ const { warning, ...clientBody } = body;
76
+ if (typeof warning === "string" && warning !== "") {
77
+ console.warn(`[P1AuthHandler] ${warning}`);
78
+ }
79
+ return NextResponse.json(clientBody);
80
+ }
81
+ /**
82
+ * Still untrusted after this — CCR validates against the site's registered
83
+ * origins. Malformed values are dropped rather than forwarded upstream.
84
+ */
85
+ async function readProposedOrigin(request) {
86
+ let parsed;
87
+ try {
88
+ parsed = await request.clone().json();
89
+ }
90
+ catch {
91
+ return undefined;
92
+ }
93
+ const candidate = parsed.origin;
94
+ if (typeof candidate !== "string" || candidate === "") {
95
+ return undefined;
96
+ }
97
+ try {
98
+ // Re-deriving the origin and requiring an exact match rejects anything
99
+ // carrying a path or credentials.
100
+ const url = new URL(candidate);
101
+ return url.origin === candidate ? candidate : undefined;
102
+ }
103
+ catch {
104
+ return undefined;
105
+ }
36
106
  }
37
107
  export async function postBrokerRedeem(request, apiKey, baseUrl) {
38
108
  if (!apiKey || !baseUrl) {
@@ -1 +1 @@
1
- {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/routes/broker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/routes/broker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-context.d.ts","sourceRoot":"","sources":["../../src/routes/datasource-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,OAAO,KAAK,EACV,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAE3C,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;CAC7C;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,wBAAwB;;;;;IAgClC"}
1
+ {"version":3,"file":"datasource-context.d.ts","sourceRoot":"","sources":["../../src/routes/datasource-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,OAAO,KAAK,EACV,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAI3C,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;CAC7C;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,wBAAwB;;;;;IA6ClC"}
@@ -1,5 +1,7 @@
1
1
  import { NextResponse } from "next/server";
2
- import { normalizePath, listRouteTemplateKeysFromDatabase, getPageEditorPreviewParams, loadRemoteDatasourceContext, } from "@pantheon-systems/puck-css/server";
2
+ import { normalizePath, listRouteTemplateKeysFromDatabase, getPageEditorPreviewParams, loadRemoteDatasourceContext, createAuthenticatedClient, } from "@pantheon-systems/puck-css/server";
3
+ import { extractBearerToken } from "../auth-utils";
4
+ import { createCssQueryFetchers } from "../css-query-fetchers";
3
5
  export async function getDatasourceContext(request, options) {
4
6
  const url = new URL(request.url);
5
7
  const rawPath = url.searchParams.get("path") ?? "/";
@@ -15,15 +17,25 @@ export async function getDatasourceContext(request, options) {
15
17
  listRouteTemplateKeysFromDatabase(),
16
18
  Promise.resolve(getPageEditorPreviewParams(path)),
17
19
  ]);
20
+ const branchId = url.searchParams.get("branchId");
18
21
  const referencedDatasourceIds = new Set([id]);
22
+ const token = extractBearerToken(request);
23
+ const client = token ? createAuthenticatedClient(token) : null;
24
+ const cssQueryFetchers = await createCssQueryFetchers({
25
+ client,
26
+ branchId,
27
+ filterIds: referencedDatasourceIds,
28
+ });
29
+ const allFetchers = [...(options.builtinFetchers ?? []), ...cssQueryFetchers];
19
30
  const context = await loadRemoteDatasourceContext({
20
31
  searchParams: Object.fromEntries(url.searchParams.entries()),
21
32
  pagePath: path,
22
33
  routeTemplateKeys,
23
34
  savedPreviewParams,
24
- builtinFetchers: options.builtinFetchers,
35
+ builtinFetchers: allFetchers,
25
36
  referencedDatasourceIds,
26
37
  });
27
- return NextResponse.json({ id, data: context[id] ?? {} });
38
+ const data = context[id] ?? {};
39
+ return NextResponse.json({ id, data });
28
40
  }
29
41
  //# sourceMappingURL=datasource-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-context.js","sourceRoot":"","sources":["../../src/routes/datasource-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,iCAAiC,EACjC,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,mCAAmC,CAAC;AAS3C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAChB,OAAiC;IAEjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IACpD,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChE,iCAAiC,EAAE;QACnC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;KAClD,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,MAAM,2BAA2B,CAAC;QAChD,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC5D,QAAQ,EAAE,IAAI;QACd,iBAAiB;QACjB,kBAAkB;QAClB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,uBAAuB;KACxB,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"datasource-context.js","sourceRoot":"","sources":["../../src/routes/datasource-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,iCAAiC,EACjC,0BAA0B,EAC1B,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,mCAAmC,CAAC;AAI3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAM/D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAChB,OAAiC;IAEjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IACpD,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChE,iCAAiC,EAAE;QACnC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;KAClD,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/D,MAAM,gBAAgB,GAAG,MAAM,sBAAsB,CAAC;QACpD,MAAM;QACN,QAAQ;QACR,SAAS,EAAE,uBAAuB;KACnC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAG,MAAM,2BAA2B,CAAC;QAChD,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC5D,QAAQ,EAAE,IAAI;QACd,iBAAiB;QACjB,kBAAkB;QAClB,eAAe,EAAE,WAAW;QAC5B,uBAAuB;KACxB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"editor-context.d.ts","sourceRoot":"","sources":["../../src/routes/editor-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,OAAO,KAAK,EACV,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,yBAAyB,CAAC,EAAE,0BAA0B,EAAE,CAAC;CAC1D;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,oBAAoB;;;;;;;;IA8B9B"}
1
+ {"version":3,"file":"editor-context.d.ts","sourceRoot":"","sources":["../../src/routes/editor-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,OAAO,KAAK,EACV,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AAG3C,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,yBAAyB,CAAC,EAAE,0BAA0B,EAAE,CAAC;CAC1D;AAsBD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,oBAAoB;;;;;;;;IAkB9B"}
@@ -1,19 +1,56 @@
1
1
  import { NextResponse } from "next/server";
2
- import { normalizePath, listRoutes, listRouteTemplateKeysFromDatabase, getPageEditorPreviewParams, buildRemoteDatasourceRegistry, listRemoteDatasourcesForPage, } from "@pantheon-systems/puck-css/server";
2
+ import { normalizePath, listRoutes, listRouteTemplateKeysFromDatabase, getPageEditorPreviewParams, buildRemoteDatasourceRegistry, listRemoteDatasourcesForPage, cssQueriesToDatasourceDefinitions, getSharedSiteId, getSharedBranchId, createAuthenticatedClient, runWithAuthToken, } from "@pantheon-systems/puck-css/server";
3
+ import { extractBearerToken } from "../auth-utils";
4
+ async function fetchCssQueryDefinitions(request, branchOverride) {
5
+ const siteId = getSharedSiteId();
6
+ const branchId = branchOverride || getSharedBranchId();
7
+ const token = extractBearerToken(request);
8
+ if (!siteId || !branchId)
9
+ return [];
10
+ if (!token)
11
+ return [];
12
+ const client = createAuthenticatedClient(token);
13
+ if (!client?.queries)
14
+ return [];
15
+ try {
16
+ const queries = await client.queries.list(siteId, branchId);
17
+ return cssQueriesToDatasourceDefinitions(queries);
18
+ }
19
+ catch (error) {
20
+ const message = error instanceof Error ? error.message : String(error);
21
+ console.warn("[P1] Editor context: CSS query lookup failed:", message);
22
+ return [];
23
+ }
24
+ }
3
25
  export async function getEditorContext(request, options) {
4
26
  const url = new URL(request.url);
5
27
  const rawPath = url.searchParams.get("path") ?? "/";
28
+ const branchId = url.searchParams.get("branchId");
6
29
  const path = rawPath === "/" ? "/" : normalizePath(rawPath);
7
30
  if (path === null) {
8
31
  return NextResponse.json({ error: "invalid_path" }, { status: 400 });
9
32
  }
33
+ // Unlike getRoutes, a missing token degrades rather than 401s: the editor
34
+ // falls back to an unauthenticated fetch and treats any error response as
35
+ // fatal, so rejecting here would break auth-optional deployments.
36
+ const token = extractBearerToken(request);
37
+ const run = (fn) => token ? runWithAuthToken(token, fn) : fn();
38
+ return run(() => buildEditorContext(request, options, path, branchId));
39
+ }
40
+ async function buildEditorContext(request, options, path, branchId) {
10
41
  const [routes, routeTemplateKeys, savedPreviewParams, userDefs] = await Promise.all([
11
42
  listRoutes(),
12
43
  listRouteTemplateKeysFromDatabase(),
13
44
  Promise.resolve(getPageEditorPreviewParams(path)),
14
45
  Promise.resolve(listRemoteDatasourcesForPage(path)),
15
46
  ]);
16
- const remoteDatasourceRegistry = buildRemoteDatasourceRegistry(options.builtinDatasourceRegistry ?? [], userDefs.global, userDefs.page);
47
+ // Must run after listRoutes() branch ID is lazily resolved during
48
+ // that call, and getSharedBranchId() returns null until it completes.
49
+ const cssQueryDefinitions = await fetchCssQueryDefinitions(request, branchId);
50
+ const remoteDatasourceRegistry = [
51
+ ...buildRemoteDatasourceRegistry(options.builtinDatasourceRegistry ?? [], userDefs.global, userDefs.page),
52
+ ...cssQueryDefinitions,
53
+ ];
17
54
  return NextResponse.json({
18
55
  remoteDatasourceContext: {},
19
56
  routes,
@@ -1 +1 @@
1
- {"version":3,"file":"editor-context.js","sourceRoot":"","sources":["../../src/routes/editor-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,UAAU,EACV,iCAAiC,EACjC,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,GAC7B,MAAM,mCAAmC,CAAC;AAW3C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgB,EAChB,OAA6B;IAE7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IACpD,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,QAAQ,CAAC,GAC7D,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,UAAU,EAAE;QACZ,iCAAiC,EAAE;QACnC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;KACpD,CAAC,CAAC;IAEL,MAAM,wBAAwB,GAAG,6BAA6B,CAC5D,OAAO,CAAC,yBAAyB,IAAI,EAAE,EACvC,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,IAAI,CACd,CAAC;IAEF,OAAO,YAAY,CAAC,IAAI,CAAC;QACvB,uBAAuB,EAAE,EAAE;QAC3B,MAAM;QACN,iBAAiB;QACjB,kBAAkB;QAClB,wBAAwB;KACzB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"editor-context.js","sourceRoot":"","sources":["../../src/routes/editor-context.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export async function postResolvePreview(request) {
10
10
  return NextResponse.json({ error: "invalid_json" }, { status: 400 });
11
11
  }
12
12
  const data = body.data ?? {};
13
- const datasourceContext = body.datasourceContext ?? {};
13
+ const datasourceContext = body.remoteDatasourceContext ?? body.datasourceContext ?? {};
14
14
  const resolved = await resolveDataTemplates(data, datasourceContext);
15
15
  return NextResponse.json({ data: resolved });
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-preview.js","sourceRoot":"","sources":["../../src/routes/resolve-preview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,EAAE,kBAAkB,IAAI,IAAI,EAAE,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAgB;IACvD,IAAI,IAA2E,CAAC;IAChF,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAgB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,IAAqB,EAAE,iBAAiB,CAAC,CAAC;IACtF,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"resolve-preview.js","sourceRoot":"","sources":["../../src/routes/resolve-preview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,EAAE,kBAAkB,IAAI,IAAI,EAAE,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAgB;IACvD,IAAI,IAA8H,CAAC;IACnI,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAgB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAEvF,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,IAAqB,EAAE,iBAAiB,CAAC,CAAC;IACtF,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { createP1Handler, type P1HandlerConfig } from "./handler";
2
2
  export { createP1AuthHandler, type P1AuthHandlerConfig } from "./auth-handler";
3
3
  export { createP1Pages, type P1PagesConfig } from "./pages-handler";
4
+ export { createCssQueryFetchers, type CreateCssQueryFetchersOptions } from "./css-query-fetchers";
5
+ export { createP1Middleware, type P1MiddlewareConfig } from "./middleware";
4
6
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,KAAK,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
package/dist/server.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { createP1Handler } from "./handler";
2
2
  export { createP1AuthHandler } from "./auth-handler";
3
3
  export { createP1Pages } from "./pages-handler";
4
+ export { createCssQueryFetchers } from "./css-query-fetchers";
5
+ export { createP1Middleware } from "./middleware";
4
6
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAwB,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAA4B,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAsB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAwB,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAA4B,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAsB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAsC,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAA2B,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pantheon-systems/p1-next-sdk",
3
- "version": "0.7.0",
3
+ "version": "0.10.0",
4
4
  "description": "Next.js SDK for P1 editor integration",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -9,12 +9,15 @@
9
9
  },
10
10
  "repository": {
11
11
  "type": "git",
12
- "url": "https://github.com/pantheon-systems/puck-css-integration.git",
12
+ "url": "git+https://github.com/pantheon-systems/p1-platform.git",
13
13
  "directory": "packages/p1-next-sdk"
14
14
  },
15
15
  "type": "module",
16
16
  "main": "./dist/index.js",
17
17
  "types": "./dist/index.d.ts",
18
+ "bin": {
19
+ "p1-migrate": "./bin/p1-migrate.js"
20
+ },
18
21
  "exports": {
19
22
  ".": {
20
23
  "import": "./dist/index.js",
@@ -26,20 +29,19 @@
26
29
  }
27
30
  },
28
31
  "files": [
29
- "dist"
32
+ "dist",
33
+ "bin"
30
34
  ],
31
35
  "dependencies": {
32
36
  "server-only": "^0.0.1",
33
- "@pantheon-systems/css-client": "0.7.0",
34
- "@pantheon-systems/puck-css": "0.7.0"
37
+ "@pantheon-systems/css-client": "0.10.0",
38
+ "@pantheon-systems/puck-css": "0.10.0"
35
39
  },
36
40
  "peerDependencies": {
37
41
  "@puckeditor/core": ">=0.21.0",
38
42
  "next": ">=14.0.0",
39
43
  "react": ">=18.0.0",
40
- "react-dom": ">=18.0.0",
41
- "@pantheon-systems/css-client": "0.7.0",
42
- "@pantheon-systems/puck-css": "0.7.0"
44
+ "react-dom": ">=18.0.0"
43
45
  },
44
46
  "devDependencies": {
45
47
  "@testing-library/dom": "^10.4.1",
@@ -51,10 +53,13 @@
51
53
  "vitest": "^4.1.5",
52
54
  "@pantheon-systems/eslint-config": "0.1.0"
53
55
  },
56
+ "homepage": "https://github.com/pantheon-systems/p1-platform/tree/main/packages/p1-next-sdk",
54
57
  "scripts": {
55
- "build": "tsc",
58
+ "build": "pnpm run clean && tsc",
56
59
  "clean": "rm -rf dist *.tsbuildinfo",
60
+ "lint": "eslint src",
61
+ "lint:fix": "eslint src --fix",
57
62
  "test": "vitest run",
58
- "lint": "eslint src"
63
+ "typecheck": "tsc --noEmit"
59
64
  }
60
65
  }