canopycms-next 0.0.1 → 0.0.3

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.
@@ -2,13 +2,18 @@ import { type CanopyContext } from 'canopycms/server';
2
2
  import type { CanopyConfig, AuthPlugin, FieldConfig } from 'canopycms';
3
3
  export interface NextCanopyOptions {
4
4
  config: CanopyConfig;
5
- authPlugin: AuthPlugin;
5
+ /** Auth plugin for user authentication. Optional for static deployments (deployedAs: 'static'). */
6
+ authPlugin?: AuthPlugin;
6
7
  entrySchemaRegistry: Record<string, readonly FieldConfig[]>;
7
8
  }
8
9
  /**
9
10
  * Create Next.js-specific wrapper around core context.
10
11
  * Adds React cache() for per-request memoization and API handler.
11
12
  * This function is async because it needs to load .collection.json meta files.
13
+ *
14
+ * In prod/prod-sim mode, if the provided authPlugin implements verifyTokenOnly(),
15
+ * it is automatically wrapped with CachingAuthPlugin + FileBasedAuthCache so that
16
+ * auth works without network access (Lambda). The cache is populated by the worker daemon.
12
17
  */
13
18
  export declare function createNextCanopyContext(options: NextCanopyOptions): Promise<{
14
19
  getCanopy: () => Promise<CanopyContext>;
@@ -1 +1 @@
1
- {"version":3,"file":"context-wrapper.d.ts","sourceRoot":"","sources":["../src/context-wrapper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,aAAa,EAAwB,MAAM,kBAAkB,CAAA;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,WAAW,CAAA;AAQlF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,CAAA;CAC5D;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB;qBAiD1C,OAAO,CAAC,aAAa,CAAC;;cAJhD,CAAA;qBAGQ,CAAC;;;qBACE,CAAC;;;;;GAef"}
1
+ {"version":3,"file":"context-wrapper.d.ts","sourceRoot":"","sources":["../src/context-wrapper.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,WAAW,CAAA;AA+BlF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB,mGAAmG;IACnG,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,CAAA;CAC5D;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB;qBAqF1C,OAAO,CAAC,aAAa,CAAC;;cAnEnC,CAAC;qBAA+B,CAAC;;;qBAC/B,CAAC;;;;;GAkFnB"}
@@ -1,16 +1,69 @@
1
+ import path from 'node:path';
1
2
  import { cache } from 'react';
2
3
  import { headers } from 'next/headers';
3
- import { createCanopyContext, createCanopyServices } from 'canopycms/server';
4
+ import { createCanopyContext, createCanopyServices, operatingStrategy, loadInternalGroups, loadBranchContext, } from 'canopycms/server';
4
5
  import { authResultToCanopyUser } from 'canopycms';
5
- import { loadInternalGroups, loadBranchContext } from 'canopycms/server';
6
+ import { CachingAuthPlugin, FileBasedAuthCache } from 'canopycms/auth/cache';
6
7
  import { createCanopyCatchAllHandler } from './adapter';
7
8
  let warnedNoAdmins = false;
9
+ let warnedStaticMode = false;
10
+ /**
11
+ * Stub auth plugin for static deployments where no real auth is needed.
12
+ * Returns unauthenticated for all requests — API routes will return 401.
13
+ */
14
+ const staticDeployAuthPlugin = {
15
+ async authenticate() {
16
+ return { success: false, error: 'No auth plugin configured (static deployment)' };
17
+ },
18
+ async searchUsers() {
19
+ return [];
20
+ },
21
+ async getUserMetadata() {
22
+ return null;
23
+ },
24
+ async getGroupMetadata() {
25
+ return null;
26
+ },
27
+ async listGroups() {
28
+ return [];
29
+ },
30
+ };
8
31
  /**
9
32
  * Create Next.js-specific wrapper around core context.
10
33
  * Adds React cache() for per-request memoization and API handler.
11
34
  * This function is async because it needs to load .collection.json meta files.
35
+ *
36
+ * In prod/prod-sim mode, if the provided authPlugin implements verifyTokenOnly(),
37
+ * it is automatically wrapped with CachingAuthPlugin + FileBasedAuthCache so that
38
+ * auth works without network access (Lambda). The cache is populated by the worker daemon.
12
39
  */
13
40
  export async function createNextCanopyContext(options) {
41
+ // Fail fast: authPlugin is required for server deployments
42
+ if (options.config.deployedAs !== 'static' && !options.authPlugin) {
43
+ throw new Error('CanopyCMS: authPlugin is required when deployedAs is "server". ' +
44
+ 'Set deployedAs: "static" in your canopy config, or provide an authPlugin.');
45
+ }
46
+ // Warn when running in static deployment mode so it is not accidentally set in a server build
47
+ if (options.config.deployedAs === 'static' && !warnedStaticMode) {
48
+ console.warn('CanopyCMS: running in static deployment mode — all CMS API requests will return 401. ' +
49
+ 'Do not set deployedAs: "static" in a server deployment.');
50
+ warnedStaticMode = true;
51
+ }
52
+ // Resolve the auth plugin: auto-wrap with CachingAuthPlugin for prod/prod-sim when
53
+ // the plugin supports token-only verification. This keeps auth networkless (required for
54
+ // Lambda) without exposing caching internals to adopters.
55
+ // For static deployments, use the stub that returns 401 for all requests.
56
+ const { mode } = options.config;
57
+ const authPlugin = (() => {
58
+ if (!options.authPlugin)
59
+ return staticDeployAuthPlugin;
60
+ if ((mode === 'prod' || mode === 'prod-sim') && options.authPlugin.verifyTokenOnly) {
61
+ const cachePath = process.env.CANOPY_AUTH_CACHE_PATH ??
62
+ path.join(operatingStrategy(mode).getWorkspaceRoot(), '.cache');
63
+ return new CachingAuthPlugin((ctx) => options.authPlugin.verifyTokenOnly(ctx), new FileBasedAuthCache(cachePath));
64
+ }
65
+ return options.authPlugin;
66
+ })();
14
67
  // Create services ONCE at initialization
15
68
  const services = await createCanopyServices(options.config, {
16
69
  entrySchemaRegistry: options.entrySchemaRegistry,
@@ -18,7 +71,7 @@ export async function createNextCanopyContext(options) {
18
71
  // User extractor: passes Next.js headers to auth plugin, loads internal groups, applies authorization
19
72
  const extractUser = async () => {
20
73
  const headersList = await headers();
21
- const authResult = await options.authPlugin.authenticate(headersList);
74
+ const authResult = await authPlugin.authenticate(headersList);
22
75
  // Load internal groups from main branch
23
76
  const baseBranch = services.config.defaultBaseBranch ?? 'main';
24
77
  const operatingMode = services.config.mode ?? 'dev';
@@ -53,6 +106,7 @@ export async function createNextCanopyContext(options) {
53
106
  // Create API handler using same services
54
107
  const handler = createCanopyCatchAllHandler({
55
108
  ...options,
109
+ authPlugin,
56
110
  services,
57
111
  });
58
112
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"context-wrapper.js","sourceRoot":"","sources":["../src/context-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,mBAAmB,EAAsB,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEhG,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAA;AAEvD,IAAI,cAAc,GAAG,KAAK,CAAA;AAQ1B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAA0B;IACtE,yCAAyC;IACzC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE;QAC1D,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;KACjD,CAAC,CAAA;IAEF,sGAAsG;IACtG,MAAM,WAAW,GAAG,KAAK,IAAyB,EAAE;QAClD,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAA;QACnC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;QAErE,wCAAwC;QACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAA;QAC9D,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAA;QACnD,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC;YAChD,UAAU,EAAE,UAAU;YACtB,IAAI,EAAE,aAAa;SACpB,CAAC,CAAA;QACF,MAAM,cAAc,GAAoB,iBAAiB;YACvD,CAAC,CAAC,MAAM,kBAAkB,CACtB,iBAAiB,CAAC,UAAU,EAC5B,aAAa,EACb,QAAQ,CAAC,iBAAiB,CAC3B,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACvB,OAAO,CAAC,IAAI,CAAC,6DAA6D,EAAE,GAAG,CAAC,CAAA;gBAChF,OAAO,EAAqB,CAAA;YAC9B,CAAC,CAAC;YACJ,CAAC,CAAC,EAAE,CAAA;QAEN,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;YACjE,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,OAAO,CAAC,IAAI,CACV,0GAA0G,CAC3G,CAAA;YACH,CAAC;YACD,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC;QAED,OAAO,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAA;IACvF,CAAC,CAAA;IAED,qEAAqE;IACrE,MAAM,WAAW,GAAG,mBAAmB,CAAC;QACtC,QAAQ;QACR,WAAW;KACZ,CAAC,CAAA;IAEF,kDAAkD;IAClD,MAAM,SAAS,GAAG,KAAK,CAAC,GAA2B,EAAE;QACnD,OAAO,WAAW,CAAC,UAAU,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,yCAAyC;IACzC,MAAM,OAAO,GAAG,2BAA2B,CAAC;QAC1C,GAAG,OAAO;QACV,QAAQ;KACT,CAAC,CAAA;IAEF,OAAO;QACL,SAAS;QACT,OAAO;QACP,QAAQ;KACT,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"context-wrapper.js","sourceRoot":"","sources":["../src/context-wrapper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canopycms-next",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Next.js adapter for CanopyCMS",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -40,8 +40,8 @@
40
40
  "node": ">=18"
41
41
  },
42
42
  "peerDependencies": {
43
- "canopycms": "^0.0.1",
44
- "next": "^0.0.1",
43
+ "canopycms": "^0.0.3",
44
+ "next": "^13.5.7 || ^14.2.25 || ^15.2.3 || ^16",
45
45
  "react": "^18.0.0 || ^19.0.0"
46
46
  },
47
47
  "devDependencies": {