@cosmicdrift/kumiko-dev-server 0.273.0 → 0.275.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-dev-server",
3
- "version": "0.273.0",
3
+ "version": "0.275.0",
4
4
  "description": "Dev-tooling for Kumiko apps: local dev-server bootstrap (runDevApp), scaffolding, codegen. Its compose-stacks/env-schema subpaths are consumed at prod boot too — see @cosmicdrift/kumiko-server-runtime for the prod runner itself.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -59,9 +59,9 @@
59
59
  "kumiko-upgrade": "./bin/kumiko-upgrade.ts"
60
60
  },
61
61
  "dependencies": {
62
- "@cosmicdrift/kumiko-bundled-features": "0.273.0",
63
- "@cosmicdrift/kumiko-framework": "0.273.0",
64
- "@cosmicdrift/kumiko-server-runtime": "0.273.0",
62
+ "@cosmicdrift/kumiko-bundled-features": "0.275.0",
63
+ "@cosmicdrift/kumiko-framework": "0.275.0",
64
+ "@cosmicdrift/kumiko-server-runtime": "0.275.0",
65
65
  "ts-morph": "^28.0.0"
66
66
  },
67
67
  "publishConfig": {
@@ -105,24 +105,22 @@ describe("composeStacks", () => {
105
105
  ]);
106
106
  });
107
107
 
108
- test("composeIdentityStack + composeGdprStack(sessions) → duplicate feature rejected at boot", () => {
108
+ test("composeIdentityStack + composeGdprStack(sessions) → identical sessions deduped at boot", () => {
109
109
  const names = stackFeatureNames([
110
110
  ...composeIdentityStack(),
111
111
  ...composeGdprStack({ sessions: true }),
112
112
  ]);
113
113
  expect(names.filter((n) => n === "sessions")).toHaveLength(2);
114
- expect(() =>
115
- validateBoot(
116
- composeFeatures(
117
- [
118
- createPersonalAccessTokensFeature({ scopes: {} }),
119
- ...composeIdentityStack(),
120
- ...composeGdprStack({ sessions: true }),
121
- ],
122
- { includeBundled: true },
123
- ),
124
- ),
125
- ).toThrow(/duplicate feature/i);
114
+ const composed = composeFeatures(
115
+ [
116
+ createPersonalAccessTokensFeature({ scopes: {} }),
117
+ ...composeIdentityStack(),
118
+ ...composeGdprStack({ sessions: true }),
119
+ ],
120
+ { includeBundled: true },
121
+ );
122
+ expect(stackFeatureNames(composed).filter((n) => n === "sessions")).toHaveLength(1);
123
+ expect(() => validateBoot(composed)).not.toThrow();
126
124
  });
127
125
  });
128
126
 
@@ -77,9 +77,8 @@ export type UserDataRightsStackOptions = {
77
77
  readonly includeDefaults?: boolean;
78
78
  };
79
79
 
80
- // `sessions` may live on composeIdentityStack OR composeGdprStack — never both
81
- // with sessions:true. composeOpsStack used to accept it too; combining presets
82
- // that each push "sessions" crashes createRegistry with "duplicate feature".
80
+ // `sessions` may live on composeIdentityStack OR composeGdprStack; both with default
81
+ // options is deduped at boot, differing options throw "Duplicate feature".
83
82
  export type OpsStackOptions = {
84
83
  readonly delivery?: boolean;
85
84
  readonly audit?: boolean;