@seifer-webapp-factory/authorization 0.1.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/README.md +17 -0
- package/backend/templates/cache/ttl-cache.ts +41 -0
- package/backend/templates/config/config-fragment.ts +41 -0
- package/backend/templates/nestjs/authz.controller.ts +253 -0
- package/backend/templates/nestjs/authz.module.ts +158 -0
- package/backend/templates/nestjs/tokens.ts +41 -0
- package/backend/templates/persistence/migrations/0001_authz.sql +45 -0
- package/backend/templates/persistence/migrations/index.ts +84 -0
- package/backend/templates/persistence/pg-policy-store.ts +193 -0
- package/backend/templates/persistence/seed.ts +60 -0
- package/dist/backend/src/index.d.ts +10 -0
- package/dist/backend/src/index.d.ts.map +1 -0
- package/dist/backend/src/index.js +9 -0
- package/dist/backend/src/index.js.map +1 -0
- package/dist/backend/src/policy.d.ts +13 -0
- package/dist/backend/src/policy.d.ts.map +1 -0
- package/dist/backend/src/policy.js +49 -0
- package/dist/backend/src/policy.js.map +1 -0
- package/dist/backend/src/ports.d.ts +90 -0
- package/dist/backend/src/ports.d.ts.map +1 -0
- package/dist/backend/src/ports.js +2 -0
- package/dist/backend/src/ports.js.map +1 -0
- package/dist/backend/src/services.d.ts +81 -0
- package/dist/backend/src/services.d.ts.map +1 -0
- package/dist/backend/src/services.js +234 -0
- package/dist/backend/src/services.js.map +1 -0
- package/dist/contract/endpoints.d.ts +433 -0
- package/dist/contract/endpoints.d.ts.map +1 -0
- package/dist/contract/endpoints.js +57 -0
- package/dist/contract/endpoints.js.map +1 -0
- package/dist/contract/errors.d.ts +33 -0
- package/dist/contract/errors.d.ts.map +1 -0
- package/dist/contract/errors.js +51 -0
- package/dist/contract/errors.js.map +1 -0
- package/dist/contract/events.d.ts +50 -0
- package/dist/contract/events.d.ts.map +1 -0
- package/dist/contract/events.js +13 -0
- package/dist/contract/events.js.map +1 -0
- package/dist/contract/index.d.ts +10 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +10 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/permissions.d.ts +35 -0
- package/dist/contract/permissions.d.ts.map +1 -0
- package/dist/contract/permissions.js +37 -0
- package/dist/contract/permissions.js.map +1 -0
- package/dist/contract/schemas.d.ts +288 -0
- package/dist/contract/schemas.d.ts.map +1 -0
- package/dist/contract/schemas.js +91 -0
- package/dist/contract/schemas.js.map +1 -0
- package/dist/frontend/src/client.d.ts +31 -0
- package/dist/frontend/src/client.d.ts.map +1 -0
- package/dist/frontend/src/client.js +83 -0
- package/dist/frontend/src/client.js.map +1 -0
- package/dist/frontend/src/composables.d.ts +62 -0
- package/dist/frontend/src/composables.d.ts.map +1 -0
- package/dist/frontend/src/composables.js +170 -0
- package/dist/frontend/src/composables.js.map +1 -0
- package/dist/frontend/src/guards.d.ts +12 -0
- package/dist/frontend/src/guards.d.ts.map +1 -0
- package/dist/frontend/src/guards.js +10 -0
- package/dist/frontend/src/guards.js.map +1 -0
- package/dist/frontend/src/index.d.ts +12 -0
- package/dist/frontend/src/index.d.ts.map +1 -0
- package/dist/frontend/src/index.js +9 -0
- package/dist/frontend/src/index.js.map +1 -0
- package/dist/manifest.d.ts +56 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +100 -0
- package/dist/manifest.js.map +1 -0
- package/dist/scaffolder/core/config.d.ts +86 -0
- package/dist/scaffolder/core/config.d.ts.map +1 -0
- package/dist/scaffolder/core/config.js +92 -0
- package/dist/scaffolder/core/config.js.map +1 -0
- package/dist/scaffolder/core/errors.d.ts +46 -0
- package/dist/scaffolder/core/errors.d.ts.map +1 -0
- package/dist/scaffolder/core/errors.js +60 -0
- package/dist/scaffolder/core/errors.js.map +1 -0
- package/dist/scaffolder/core/extend.d.ts +86 -0
- package/dist/scaffolder/core/extend.d.ts.map +1 -0
- package/dist/scaffolder/core/extend.js +94 -0
- package/dist/scaffolder/core/extend.js.map +1 -0
- package/dist/scaffolder/core/materialize.d.ts +71 -0
- package/dist/scaffolder/core/materialize.d.ts.map +1 -0
- package/dist/scaffolder/core/materialize.js +47 -0
- package/dist/scaffolder/core/materialize.js.map +1 -0
- package/dist/scaffolder/core/ports.d.ts +39 -0
- package/dist/scaffolder/core/ports.d.ts.map +1 -0
- package/dist/scaffolder/core/ports.js +33 -0
- package/dist/scaffolder/core/ports.js.map +1 -0
- package/dist/scaffolder/core/presence.d.ts +34 -0
- package/dist/scaffolder/core/presence.d.ts.map +1 -0
- package/dist/scaffolder/core/presence.js +29 -0
- package/dist/scaffolder/core/presence.js.map +1 -0
- package/dist/scaffolder/core/three-way-merge.d.ts +113 -0
- package/dist/scaffolder/core/three-way-merge.d.ts.map +1 -0
- package/dist/scaffolder/core/three-way-merge.js +184 -0
- package/dist/scaffolder/core/three-way-merge.js.map +1 -0
- package/dist/scaffolder/index.d.ts +25 -0
- package/dist/scaffolder/index.d.ts.map +1 -0
- package/dist/scaffolder/index.js +24 -0
- package/dist/scaffolder/index.js.map +1 -0
- package/frontend/templates/components/PermissionMatrix.vue +134 -0
- package/frontend/templates/i18n/en.json +61 -0
- package/frontend/templates/i18n/nl.json +61 -0
- package/frontend/templates/middleware/permission.ts +54 -0
- package/frontend/templates/pages/access-assignments.vue +151 -0
- package/frontend/templates/pages/role-editor.vue +169 -0
- package/frontend/templates/pages/roles-list.vue +84 -0
- package/frontend/templates/plugins/authz.client.ts +108 -0
- package/frontend/templates/runtime.ts +60 -0
- package/package.json +76 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* materialize — de GENERATE-stap van de version-aware materializer (US-Z0803).
|
|
3
|
+
*
|
|
4
|
+
* Gegeven de surface-`FileDescriptor`s van de authorization-module schrijft deze functie ze via een
|
|
5
|
+
* geïnjecteerde fs-port in een doelproject. Vanaf dat moment is de surface projecteigendom en mag ze
|
|
6
|
+
* divergeren; het mechanisme (`backend/src`, `frontend/src`, `contract/`) blijft een gepinde dependency. De functie:
|
|
7
|
+
*
|
|
8
|
+
* - stempelt de `templateVersion` per bestand in een `MaterializationRecord` (de basis waartegen een
|
|
9
|
+
* latere upgrade-merge diff't — US-Z0804),
|
|
10
|
+
* - verzamelt ÁLLE collisions en weigert all-or-nothing zonder `overwrite` (nooit stil overschrijven),
|
|
11
|
+
* - weigert te starten als een vereiste requires-port ontbreekt (AC3), zodat er geen half-gewirede
|
|
12
|
+
* surface achterblijft.
|
|
13
|
+
*
|
|
14
|
+
* Puur op de fs-port na: geen echt filesystem, geen module-globale mutable state, deterministisch
|
|
15
|
+
* (invoervolgorde blijft behouden, geen Date.now/random).
|
|
16
|
+
*/
|
|
17
|
+
import type { CapabilityModuleManifest } from '../../manifest.js';
|
|
18
|
+
import type { AuthzScaffolderFsPort, FileDescriptor } from './ports.js';
|
|
19
|
+
/** De stempel van één gematerialiseerd bestand: de bronversie én de exact geschreven basis-inhoud. */
|
|
20
|
+
export interface MaterializedFile {
|
|
21
|
+
/** De `templateVersion` waaruit dit bestand is gegenereerd. */
|
|
22
|
+
readonly templateVersion: string;
|
|
23
|
+
/** De precies gematerialiseerde template-inhoud — de `base` voor een latere three-way-merge. */
|
|
24
|
+
readonly base: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Het per-project stempelrecord (manifest/lockfile-vorm): welke surface-bestanden zijn gematerialiseerd,
|
|
28
|
+
* vanaf welke `templateVersion`, met hun basis-inhoud. `files` mapt bestand → stempel; `templateVersion`
|
|
29
|
+
* is de module-brede versie waarmee gematerialiseerd is.
|
|
30
|
+
*/
|
|
31
|
+
export interface MaterializationRecord {
|
|
32
|
+
/** Module-slug, bv. 'authorization'. */
|
|
33
|
+
readonly module: string;
|
|
34
|
+
/** De module-brede templateVersion waarmee gematerialiseerd is. */
|
|
35
|
+
readonly templateVersion: string;
|
|
36
|
+
/** Bestand-pad → stempel (versie + basis-inhoud). */
|
|
37
|
+
readonly files: Readonly<Record<string, MaterializedFile>>;
|
|
38
|
+
}
|
|
39
|
+
/** Opties voor `materializeAuthzModule`. */
|
|
40
|
+
export interface MaterializeOptions {
|
|
41
|
+
/** Het (gevalideerde) capability-manifest dat de materialisatie stuurt. */
|
|
42
|
+
readonly manifest: CapabilityModuleManifest;
|
|
43
|
+
/** De surface-bestanden die gematerialiseerd worden (uitsluitend surface — US-Z0802). */
|
|
44
|
+
readonly surfaceFiles: readonly FileDescriptor[];
|
|
45
|
+
/** De geïnjecteerde fs-port; alle writes lopen hierlangs. */
|
|
46
|
+
readonly fsPort: AuthzScaffolderFsPort;
|
|
47
|
+
/** Overschrijf de te stempelen versie; standaard `manifest.templateVersion`. */
|
|
48
|
+
readonly templateVersion?: string;
|
|
49
|
+
/** Sta overschrijven van bestaande bestanden toe (expliciete eject/regenerate). */
|
|
50
|
+
readonly overwrite?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* De requires-ports die de host levert. Wordt dit opgegeven, dan controleert de materializer dat
|
|
53
|
+
* `manifest.requires.ports` een deelverzameling is en weigert anders (AC3). Weggelaten = check overslaan.
|
|
54
|
+
*/
|
|
55
|
+
readonly providedPorts?: readonly string[];
|
|
56
|
+
}
|
|
57
|
+
/** Resultaat van een geslaagde materialisatie: het stempelrecord + de geschreven paden (in volgorde). */
|
|
58
|
+
export interface MaterializeResult {
|
|
59
|
+
readonly record: MaterializationRecord;
|
|
60
|
+
readonly written: readonly string[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Materialiseert de surface van de authorization-module in een project.
|
|
64
|
+
*
|
|
65
|
+
* @throws MissingRequiredPortError als een vereiste port ontbreekt (geen enkele write gebeurt)
|
|
66
|
+
* @throws AuthzMaterializationConflictError als bestanden al bestaan en `overwrite` niet gezet is
|
|
67
|
+
*/
|
|
68
|
+
export declare function materializeAuthzModule(options: MaterializeOptions): MaterializeResult;
|
|
69
|
+
/** Convenience: het stempelrecord platgeslagen tot een pure `bestand → templateVersion`-map. */
|
|
70
|
+
export declare function stampedVersions(record: MaterializationRecord): Record<string, string>;
|
|
71
|
+
//# sourceMappingURL=materialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../../../scaffolder/core/materialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGxE,sGAAsG;AACtG,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,gGAAgG;IAChG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC5D;AAED,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,yFAAyF;IACzF,QAAQ,CAAC,YAAY,EAAE,SAAS,cAAc,EAAE,CAAC;IACjD,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,gFAAgF;IAChF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,mFAAmF;IACnF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,yGAAyG;AACzG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CAkCrF;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMrF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { AuthzMaterializationConflictError, MissingRequiredPortError } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Materialiseert de surface van de authorization-module in een project.
|
|
4
|
+
*
|
|
5
|
+
* @throws MissingRequiredPortError als een vereiste port ontbreekt (geen enkele write gebeurt)
|
|
6
|
+
* @throws AuthzMaterializationConflictError als bestanden al bestaan en `overwrite` niet gezet is
|
|
7
|
+
*/
|
|
8
|
+
export function materializeAuthzModule(options) {
|
|
9
|
+
const { manifest, surfaceFiles, fsPort, overwrite = false, providedPorts } = options;
|
|
10
|
+
const templateVersion = options.templateVersion ?? manifest.templateVersion;
|
|
11
|
+
// (1) Requires-ports: weiger vóór welke write dan ook als de host er één niet levert.
|
|
12
|
+
if (providedPorts !== undefined) {
|
|
13
|
+
const geleverd = new Set(providedPorts);
|
|
14
|
+
const missing = manifest.requires.ports.filter((port) => !geleverd.has(port));
|
|
15
|
+
if (missing.length > 0) {
|
|
16
|
+
throw new MissingRequiredPortError(missing);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// (2) Collision-check: verzamel ÁLLE conflicten en weiger all-or-nothing (nooit stil overschrijven).
|
|
20
|
+
if (!overwrite) {
|
|
21
|
+
const conflicts = surfaceFiles.filter((f) => fsPort.exists(f.path)).map((f) => f.path);
|
|
22
|
+
if (conflicts.length > 0) {
|
|
23
|
+
throw new AuthzMaterializationConflictError(conflicts);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// (3) Schrijf de surface en stempel per bestand de templateVersion + de basis-inhoud.
|
|
27
|
+
const files = {};
|
|
28
|
+
const written = [];
|
|
29
|
+
for (const descriptor of surfaceFiles) {
|
|
30
|
+
fsPort.write(descriptor.path, descriptor.contents);
|
|
31
|
+
files[descriptor.path] = { templateVersion, base: descriptor.contents };
|
|
32
|
+
written.push(descriptor.path);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
record: { module: manifest.name, templateVersion, files },
|
|
36
|
+
written,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Convenience: het stempelrecord platgeslagen tot een pure `bestand → templateVersion`-map. */
|
|
40
|
+
export function stampedVersions(record) {
|
|
41
|
+
const out = {};
|
|
42
|
+
for (const [path, file] of Object.entries(record.files)) {
|
|
43
|
+
out[path] = file.templateVersion;
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=materialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../../scaffolder/core/materialize.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,iCAAiC,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAiD1F;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAA2B;IAChE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACrF,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC;IAE5E,sFAAsF;IACtF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,qGAAqG;IACrG,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,iCAAiC,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,MAAM,KAAK,GAAqC,EAAE,CAAC;IACnD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO;QACL,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE;QACzD,OAAO;KACR,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ports — de geïnjecteerde randen van de scaffolder. De core-functies raken NOOIT een echt
|
|
3
|
+
* filesystem: ze krijgen een {@link AuthzScaffolderFsPort} injected en werken uitsluitend met
|
|
4
|
+
* {@link FileDescriptor}s. Zo blijft de materializer deterministisch, testbaar met een in-memory
|
|
5
|
+
* port en vrij van module-globale mutable state.
|
|
6
|
+
*
|
|
7
|
+
* Spiegelt bewust de frontend-scaffolder (`kits/frontend/.../wiring-generator.ts`): dezelfde
|
|
8
|
+
* `{ path, contents }`-descriptor en dezelfde kleine, synchrone fs-port — één tier hoger.
|
|
9
|
+
*/
|
|
10
|
+
/** Eén te materialiseren bestand: relatief pad + volledige inhoud. Pure data, geen side-effects. */
|
|
11
|
+
export interface FileDescriptor {
|
|
12
|
+
readonly path: string;
|
|
13
|
+
readonly contents: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Minimale, injecteerbare fs-port. Bewust synchroon en klein zodat hij triviaal te mocken is.
|
|
17
|
+
* `read` is nodig omdat de upgrade-merge de (mogelijk gedivergeerde) projectbestanden moet inlezen.
|
|
18
|
+
*/
|
|
19
|
+
export interface AuthzScaffolderFsPort {
|
|
20
|
+
/** Bestaat er al een bestand op dit pad? */
|
|
21
|
+
exists(path: string): boolean;
|
|
22
|
+
/** Leest de huidige inhoud; gooit als het pad niet bestaat. */
|
|
23
|
+
read(path: string): string;
|
|
24
|
+
/** Schrijft (of overschrijft) de inhoud op dit pad. */
|
|
25
|
+
write(path: string, contents: string): void;
|
|
26
|
+
}
|
|
27
|
+
/** Een in-memory fs-port met een `snapshot()` erbij, voor tests én voor de re-scaffold-naar-temp-stap. */
|
|
28
|
+
export interface MemoryFsPort extends AuthzScaffolderFsPort {
|
|
29
|
+
/** Geeft een gewone-object-kopie van de huidige inhoud (pad → inhoud). Deterministisch. */
|
|
30
|
+
snapshot(): Record<string, string>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Maakt een verse, geïsoleerde in-memory fs-port. Elke aanroep levert een eigen store — geen
|
|
34
|
+
* module-globale mutable state, zodat parallelle tests elkaar niet besmetten.
|
|
35
|
+
*
|
|
36
|
+
* @param seed optionele begininhoud (pad → inhoud)
|
|
37
|
+
*/
|
|
38
|
+
export declare function createMemoryFsPort(seed?: Readonly<Record<string, string>>): MemoryFsPort;
|
|
39
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../scaffolder/core/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,oGAAoG;AACpG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,+DAA+D;IAC/D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,uDAAuD;IACvD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,0GAA0G;AAC1G,MAAM,WAAW,YAAa,SAAQ,qBAAqB;IACzD,2FAA2F;IAC3F,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,YAAY,CAgBxF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ports — de geïnjecteerde randen van de scaffolder. De core-functies raken NOOIT een echt
|
|
3
|
+
* filesystem: ze krijgen een {@link AuthzScaffolderFsPort} injected en werken uitsluitend met
|
|
4
|
+
* {@link FileDescriptor}s. Zo blijft de materializer deterministisch, testbaar met een in-memory
|
|
5
|
+
* port en vrij van module-globale mutable state.
|
|
6
|
+
*
|
|
7
|
+
* Spiegelt bewust de frontend-scaffolder (`kits/frontend/.../wiring-generator.ts`): dezelfde
|
|
8
|
+
* `{ path, contents }`-descriptor en dezelfde kleine, synchrone fs-port — één tier hoger.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Maakt een verse, geïsoleerde in-memory fs-port. Elke aanroep levert een eigen store — geen
|
|
12
|
+
* module-globale mutable state, zodat parallelle tests elkaar niet besmetten.
|
|
13
|
+
*
|
|
14
|
+
* @param seed optionele begininhoud (pad → inhoud)
|
|
15
|
+
*/
|
|
16
|
+
export function createMemoryFsPort(seed) {
|
|
17
|
+
const store = new Map(seed ? Object.entries(seed) : []);
|
|
18
|
+
return {
|
|
19
|
+
exists: (path) => store.has(path),
|
|
20
|
+
read: (path) => {
|
|
21
|
+
const value = store.get(path);
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
throw new Error(`Bestand niet gevonden op de fs-port: ${path}`);
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
},
|
|
27
|
+
write: (path, contents) => {
|
|
28
|
+
store.set(path, contents);
|
|
29
|
+
},
|
|
30
|
+
snapshot: () => Object.fromEntries([...store.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../scaffolder/core/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2BH;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuC;IACxE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAiB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO;QACL,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YACxB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1G,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* presence — de module→module presence-check die de scaffolder erbij krijgt (US-Z0803).
|
|
3
|
+
*
|
|
4
|
+
* De authorization-module is de eerste die van een ándere capability-module afhangt
|
|
5
|
+
* (`requires.modules: ['authentication']`). Voordat de scaffolder assembleert, bewaakt
|
|
6
|
+
* `checkRequiredModules` dat elke vereiste module daadwerkelijk aanwezig is in de doel-assemblage.
|
|
7
|
+
* Ontbreekt er één, dan weigert de scaffolder fail-fast met een expliciete melding (nooit stil een
|
|
8
|
+
* halve autorisatie-laag genereren die op een afwezige authenticatie-module leunt).
|
|
9
|
+
*
|
|
10
|
+
* Puur & deterministisch: geen fs, geen module-globale mutable state, geen random/timestamps.
|
|
11
|
+
*/
|
|
12
|
+
import type { CapabilityModuleManifest } from '../../manifest.js';
|
|
13
|
+
/**
|
|
14
|
+
* Controleert dat elke `manifest.requires.modules`-entry in `presentModules` zit. Ontbreekt er één
|
|
15
|
+
* of meer, dan wordt een {@link MissingRequiredModuleError} geworpen met ÁLLE ontbrekende modules.
|
|
16
|
+
* Heeft het manifest geen `requires.modules`, dan is er niets te controleren (no-op).
|
|
17
|
+
*
|
|
18
|
+
* @throws MissingRequiredModuleError als een vereiste module niet aanwezig is
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkRequiredModules(manifest: CapabilityModuleManifest, presentModules: readonly string[]): void;
|
|
21
|
+
/** Opties voor `assertAssemblable`. */
|
|
22
|
+
export interface AssemblableOptions {
|
|
23
|
+
/** De capability-modules die in de doel-assemblage aanwezig zijn. */
|
|
24
|
+
readonly presentModules: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Kleine helper die vóór het assembleren bevestigt dat de module assembleerbaar is: momenteel is dat
|
|
28
|
+
* exact de module-presence-check (US-Z0803). Gooit dezelfde {@link MissingRequiredModuleError} als
|
|
29
|
+
* `checkRequiredModules`; bedoeld als één duidelijk instappunt voor de scaffolder-orkestratie.
|
|
30
|
+
*
|
|
31
|
+
* @throws MissingRequiredModuleError als een vereiste module niet aanwezig is
|
|
32
|
+
*/
|
|
33
|
+
export declare function assertAssemblable(manifest: CapabilityModuleManifest, options: AssemblableOptions): void;
|
|
34
|
+
//# sourceMappingURL=presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../../scaffolder/core/presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAGlE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,wBAAwB,EAClC,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,IAAI,CASN;AAED,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,kBAAkB,GAC1B,IAAI,CAEN"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { MissingRequiredModuleError } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Controleert dat elke `manifest.requires.modules`-entry in `presentModules` zit. Ontbreekt er één
|
|
4
|
+
* of meer, dan wordt een {@link MissingRequiredModuleError} geworpen met ÁLLE ontbrekende modules.
|
|
5
|
+
* Heeft het manifest geen `requires.modules`, dan is er niets te controleren (no-op).
|
|
6
|
+
*
|
|
7
|
+
* @throws MissingRequiredModuleError als een vereiste module niet aanwezig is
|
|
8
|
+
*/
|
|
9
|
+
export function checkRequiredModules(manifest, presentModules) {
|
|
10
|
+
const required = manifest.requires.modules;
|
|
11
|
+
if (required === undefined || required.length === 0)
|
|
12
|
+
return;
|
|
13
|
+
const aanwezig = new Set(presentModules);
|
|
14
|
+
const missing = required.filter((module) => !aanwezig.has(module));
|
|
15
|
+
if (missing.length > 0) {
|
|
16
|
+
throw new MissingRequiredModuleError(missing);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Kleine helper die vóór het assembleren bevestigt dat de module assembleerbaar is: momenteel is dat
|
|
21
|
+
* exact de module-presence-check (US-Z0803). Gooit dezelfde {@link MissingRequiredModuleError} als
|
|
22
|
+
* `checkRequiredModules`; bedoeld als één duidelijk instappunt voor de scaffolder-orkestratie.
|
|
23
|
+
*
|
|
24
|
+
* @throws MissingRequiredModuleError als een vereiste module niet aanwezig is
|
|
25
|
+
*/
|
|
26
|
+
export function assertAssemblable(manifest, options) {
|
|
27
|
+
checkRequiredModules(manifest, options.presentModules);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.js","sourceRoot":"","sources":["../../../scaffolder/core/presence.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAkC,EAClC,cAAiC;IAEjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE5D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAkC,EAClC,OAA2B;IAE3B,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* three-way-merge — de UPGRADE-stap die "mag divergeren" van een val naar een feature maakt (US-Z0804).
|
|
3
|
+
*
|
|
4
|
+
* Per surface-bestand reconcilieert `mergeSurface` drie versies:
|
|
5
|
+
* - `base` = de oorspronkelijk gematerialiseerde template (uit het `MaterializationRecord`),
|
|
6
|
+
* - `upstream` = de nieuwe template-versie,
|
|
7
|
+
* - `current` = het (mogelijk gedivergeerde) projectbestand.
|
|
8
|
+
*
|
|
9
|
+
* Regels:
|
|
10
|
+
* - `current === base` → schoon toepassen: neem `upstream` over (project onaangeroerd).
|
|
11
|
+
* - `upstream === base` → behoud `current` (upstream ongewijzigd; divergentie blijft staan).
|
|
12
|
+
* - `current === upstream` → beide al gelijk; niets te doen.
|
|
13
|
+
* - anders → regel-gebaseerde diff3: niet-botsende wijzigingen mergen, botsende
|
|
14
|
+
* krijgen CONFLICT-markers (nooit stil overschrijven).
|
|
15
|
+
*
|
|
16
|
+
* `upgradeSurface` orkestreert dit over alle bestanden met behulp van het `MaterializationRecord` en
|
|
17
|
+
* de twee templateVersions. Puur & deterministisch: geen fs-side-effects in de merge zelf, geen random.
|
|
18
|
+
*/
|
|
19
|
+
import type { AuthzScaffolderFsPort, FileDescriptor } from './ports.js';
|
|
20
|
+
import type { MaterializationRecord } from './materialize.js';
|
|
21
|
+
/** De uitkomst-categorie van een merge. */
|
|
22
|
+
export type MergeStatus = 'clean' | 'unchanged' | 'merged' | 'conflict';
|
|
23
|
+
/** Labels die in de conflict-markers verschijnen. */
|
|
24
|
+
export interface MergeMarkerLabels {
|
|
25
|
+
readonly current: string;
|
|
26
|
+
readonly base: string;
|
|
27
|
+
readonly upstream: string;
|
|
28
|
+
}
|
|
29
|
+
/** Invoer voor één bestand-merge. */
|
|
30
|
+
export interface MergeInput {
|
|
31
|
+
readonly base: string;
|
|
32
|
+
readonly upstream: string;
|
|
33
|
+
readonly current: string;
|
|
34
|
+
readonly labels?: MergeMarkerLabels;
|
|
35
|
+
}
|
|
36
|
+
/** Resultaat van één bestand-merge. */
|
|
37
|
+
export interface MergeResult {
|
|
38
|
+
readonly status: MergeStatus;
|
|
39
|
+
/** De uiteindelijke inhoud (met conflict-markers als `status === 'conflict'`). */
|
|
40
|
+
readonly contents: string;
|
|
41
|
+
/** True als er minstens één conflict-hunk in zit. */
|
|
42
|
+
readonly conflict: boolean;
|
|
43
|
+
/** Aantal conflict-hunks (0 als schoon). */
|
|
44
|
+
readonly conflicts: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Reconcilieert één bestand (base ↔ upstream ↔ current). Zie de bestandskop voor de regels.
|
|
48
|
+
*/
|
|
49
|
+
export declare function mergeSurface(input: MergeInput): MergeResult;
|
|
50
|
+
/** De uitkomst per bestand binnen een upgrade. */
|
|
51
|
+
export interface FileUpgradeOutcome {
|
|
52
|
+
readonly path: string;
|
|
53
|
+
/** Merge-status, of 'added' voor een nieuw upstream-bestand dat nog niet in het project stond. */
|
|
54
|
+
readonly status: MergeStatus | 'added';
|
|
55
|
+
readonly contents: string;
|
|
56
|
+
readonly conflict: boolean;
|
|
57
|
+
}
|
|
58
|
+
/** Uitkomst van een acceptatiegate (contract-tests + verticale e2e). */
|
|
59
|
+
export interface GateOutcome {
|
|
60
|
+
readonly ok: boolean;
|
|
61
|
+
/** Naam van de gefaalde gate (bv. 'contract' of 'e2e'), indien van toepassing. */
|
|
62
|
+
readonly failed?: string;
|
|
63
|
+
}
|
|
64
|
+
/** Een acceptatiegate-callback die na de merge draait; ontvangt de voorgestelde bestanden. */
|
|
65
|
+
export type AcceptanceGate = (files: readonly FileUpgradeOutcome[]) => GateOutcome;
|
|
66
|
+
/** Opties voor `upgradeSurface`. */
|
|
67
|
+
export interface UpgradeOptions {
|
|
68
|
+
/** Het stempelrecord van de vorige materialisatie (levert base + fromVersion per bestand). */
|
|
69
|
+
readonly record: MaterializationRecord;
|
|
70
|
+
/** De nieuwe surface-templates (upstream), voor de doel-`toVersion`. */
|
|
71
|
+
readonly upstreamFiles: readonly FileDescriptor[];
|
|
72
|
+
/** De doel-templateVersion die na een veilige upgrade gestempeld wordt. */
|
|
73
|
+
readonly toVersion: string;
|
|
74
|
+
/** Fs-port om de huidige (mogelijk gedivergeerde) projectbestanden in te lezen. */
|
|
75
|
+
readonly fsPort: AuthzScaffolderFsPort;
|
|
76
|
+
/**
|
|
77
|
+
* Schrijf de gemergede inhoud terug via de fs-port. Standaard `false` (droog: alleen een plan).
|
|
78
|
+
* Conflict-bestanden worden NOOIT geschreven, ook niet met `write: true` — ze wachten op reconciliatie.
|
|
79
|
+
*/
|
|
80
|
+
readonly write?: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Optionele acceptatiegate (contract + e2e). Wordt hij opgegeven én slaagt hij niet, dan is de
|
|
83
|
+
* upgrade niet veilig (US-Z0804 AC3 / US-Z1004 AC3): bewuste overschrijding richting fork (niveau 4).
|
|
84
|
+
*/
|
|
85
|
+
readonly gate?: AcceptanceGate;
|
|
86
|
+
readonly labels?: MergeMarkerLabels;
|
|
87
|
+
}
|
|
88
|
+
/** Uitkomst van een volledige upgrade-run. */
|
|
89
|
+
export interface UpgradeResult {
|
|
90
|
+
readonly fromVersion: string;
|
|
91
|
+
readonly toVersion: string;
|
|
92
|
+
readonly files: readonly FileUpgradeOutcome[];
|
|
93
|
+
/** Paden met een onopgelost conflict. */
|
|
94
|
+
readonly conflicts: readonly string[];
|
|
95
|
+
/**
|
|
96
|
+
* Is de upgrade veilig? True als er geen conflicten zijn ÉN (indien opgegeven) de gate groen is.
|
|
97
|
+
* Bij `false` is de divergentie bewust richting niveau 4 (fork) gegaan tenzij eerst gereconcilieerd.
|
|
98
|
+
*/
|
|
99
|
+
readonly safe: boolean;
|
|
100
|
+
/** Uitkomst van de gate, indien er één is opgegeven. */
|
|
101
|
+
readonly gate?: GateOutcome;
|
|
102
|
+
/**
|
|
103
|
+
* Het bijgewerkte stempelrecord: schoon-toegepaste/gemergede bestanden staan op `toVersion` met de
|
|
104
|
+
* nieuwe basis; conflict-bestanden houden hun oude stempel tot ze gereconcilieerd zijn.
|
|
105
|
+
*/
|
|
106
|
+
readonly record: MaterializationRecord;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Orkestreert de upgrade over alle upstream-bestanden op basis van het stempelrecord.
|
|
110
|
+
* Mecht uitsluitend de surface; het mechanisme upgradet los via semver (buiten deze functie).
|
|
111
|
+
*/
|
|
112
|
+
export declare function upgradeSurface(options: UpgradeOptions): UpgradeResult;
|
|
113
|
+
//# sourceMappingURL=three-way-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-way-merge.d.ts","sourceRoot":"","sources":["../../../scaffolder/core/three-way-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
const DEFAULT_LABELS = { current: 'current', base: 'base', upstream: 'upstream' };
|
|
2
|
+
/**
|
|
3
|
+
* Reconcilieert één bestand (base ↔ upstream ↔ current). Zie de bestandskop voor de regels.
|
|
4
|
+
*/
|
|
5
|
+
export function mergeSurface(input) {
|
|
6
|
+
const { base, upstream, current } = input;
|
|
7
|
+
const labels = input.labels ?? DEFAULT_LABELS;
|
|
8
|
+
// Snelle, exacte gevallen — behandeld vóór de regel-diff zodat triviale upgrades geen merge doen.
|
|
9
|
+
if (current === base) {
|
|
10
|
+
// Project heeft niets aangeraakt → neem de nieuwe template schoon over.
|
|
11
|
+
return { status: 'clean', contents: upstream, conflict: false, conflicts: 0 };
|
|
12
|
+
}
|
|
13
|
+
if (upstream === base) {
|
|
14
|
+
// Upstream is onveranderd → behoud de (gedivergeerde) projectversie.
|
|
15
|
+
return { status: 'unchanged', contents: current, conflict: false, conflicts: 0 };
|
|
16
|
+
}
|
|
17
|
+
if (current === upstream) {
|
|
18
|
+
// Beide kanten kwamen op dezelfde inhoud uit → niets te mergen.
|
|
19
|
+
return { status: 'clean', contents: current, conflict: false, conflicts: 0 };
|
|
20
|
+
}
|
|
21
|
+
// Echte drie-weg-merge op regelniveau.
|
|
22
|
+
const { lines, conflicts } = threeWayMergeLines(splitLines(base), splitLines(current), splitLines(upstream), labels);
|
|
23
|
+
const contents = lines.join('\n');
|
|
24
|
+
return {
|
|
25
|
+
status: conflicts > 0 ? 'conflict' : 'merged',
|
|
26
|
+
contents,
|
|
27
|
+
conflict: conflicts > 0,
|
|
28
|
+
conflicts,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Splitst inhoud in regels. Behoudt lege staart-regels zodat join('\n') exact terugkeert. */
|
|
32
|
+
function splitLines(text) {
|
|
33
|
+
return text.split('\n');
|
|
34
|
+
}
|
|
35
|
+
/** Array-gelijkheid op regels. */
|
|
36
|
+
function equalLines(a, b) {
|
|
37
|
+
if (a.length !== b.length)
|
|
38
|
+
return false;
|
|
39
|
+
for (let i = 0; i < a.length; i++) {
|
|
40
|
+
if (a[i] !== b[i])
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Longest common subsequence van twee regel-arrays. Levert de gematchte index-paren [xIdx, yIdx] in
|
|
47
|
+
* oplopende volgorde. Klassieke DP; deterministisch (bij gelijke lengte kiest hij consequent x++).
|
|
48
|
+
*/
|
|
49
|
+
function lcsPairs(x, y) {
|
|
50
|
+
const n = x.length;
|
|
51
|
+
const m = y.length;
|
|
52
|
+
const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
53
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
54
|
+
for (let j = m - 1; j >= 0; j--) {
|
|
55
|
+
dp[i][j] = x[i] === y[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const pairs = [];
|
|
59
|
+
let i = 0;
|
|
60
|
+
let j = 0;
|
|
61
|
+
while (i < n && j < m) {
|
|
62
|
+
if (x[i] === y[j]) {
|
|
63
|
+
pairs.push([i, j]);
|
|
64
|
+
i++;
|
|
65
|
+
j++;
|
|
66
|
+
}
|
|
67
|
+
else if (dp[i + 1][j] >= dp[i][j + 1]) {
|
|
68
|
+
i++;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
j++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return pairs;
|
|
75
|
+
}
|
|
76
|
+
/** Zet LCS-paren om naar een map baseIndex → otherIndex. */
|
|
77
|
+
function matchMap(pairs) {
|
|
78
|
+
const map = new Map();
|
|
79
|
+
for (const [o, other] of pairs)
|
|
80
|
+
map.set(o, other);
|
|
81
|
+
return map;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* De eigenlijke diff3. Ankers = base-regels die ONgewijzigd zijn in zowel `current` als `upstream`
|
|
85
|
+
* (aanwezig in beide LCS'en). Tussen opeenvolgende ankers classificeren we het segment:
|
|
86
|
+
* - alleen upstream wijzigde → neem upstream-segment,
|
|
87
|
+
* - alleen current wijzigde → neem current-segment,
|
|
88
|
+
* - beide identiek gewijzigd → neem dat (geen conflict),
|
|
89
|
+
* - beide verschillend → CONFLICT-markers.
|
|
90
|
+
* Omdat beide LCS'en monotoon zijn in de base-index, zijn de ankers monotoon in alle drie de indices.
|
|
91
|
+
*/
|
|
92
|
+
function threeWayMergeLines(base, current, upstream, labels) {
|
|
93
|
+
const matchCurrent = matchMap(lcsPairs(base, current)); // baseIdx → currentIdx
|
|
94
|
+
const matchUpstream = matchMap(lcsPairs(base, upstream)); // baseIdx → upstreamIdx
|
|
95
|
+
const anchors = [];
|
|
96
|
+
for (let o = 0; o < base.length; o++) {
|
|
97
|
+
const a = matchCurrent.get(o);
|
|
98
|
+
const b = matchUpstream.get(o);
|
|
99
|
+
if (a !== undefined && b !== undefined)
|
|
100
|
+
anchors.push({ o, a, b });
|
|
101
|
+
}
|
|
102
|
+
const out = [];
|
|
103
|
+
let conflicts = 0;
|
|
104
|
+
let po = -1;
|
|
105
|
+
let pa = -1;
|
|
106
|
+
let pb = -1;
|
|
107
|
+
const emitSegment = (oE, aE, bE) => {
|
|
108
|
+
const baseSeg = base.slice(po + 1, oE);
|
|
109
|
+
const currentSeg = current.slice(pa + 1, aE);
|
|
110
|
+
const upstreamSeg = upstream.slice(pb + 1, bE);
|
|
111
|
+
if (baseSeg.length === 0 && currentSeg.length === 0 && upstreamSeg.length === 0)
|
|
112
|
+
return;
|
|
113
|
+
if (equalLines(currentSeg, baseSeg)) {
|
|
114
|
+
out.push(...upstreamSeg); // alleen upstream wijzigde
|
|
115
|
+
}
|
|
116
|
+
else if (equalLines(upstreamSeg, baseSeg)) {
|
|
117
|
+
out.push(...currentSeg); // alleen current wijzigde
|
|
118
|
+
}
|
|
119
|
+
else if (equalLines(currentSeg, upstreamSeg)) {
|
|
120
|
+
out.push(...currentSeg); // beide dezelfde wijziging
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
conflicts++;
|
|
124
|
+
out.push(`<<<<<<< ${labels.current}`, ...currentSeg, `||||||| ${labels.base}`, ...baseSeg, '=======', ...upstreamSeg, `>>>>>>> ${labels.upstream}`);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
for (const anchor of anchors) {
|
|
128
|
+
emitSegment(anchor.o, anchor.a, anchor.b);
|
|
129
|
+
out.push(base[anchor.o]); // het anker zelf is in alle drie identiek
|
|
130
|
+
po = anchor.o;
|
|
131
|
+
pa = anchor.a;
|
|
132
|
+
pb = anchor.b;
|
|
133
|
+
}
|
|
134
|
+
// Staart-segment na het laatste anker.
|
|
135
|
+
emitSegment(base.length, current.length, upstream.length);
|
|
136
|
+
return { lines: out, conflicts };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Orkestreert de upgrade over alle upstream-bestanden op basis van het stempelrecord.
|
|
140
|
+
* Mecht uitsluitend de surface; het mechanisme upgradet los via semver (buiten deze functie).
|
|
141
|
+
*/
|
|
142
|
+
export function upgradeSurface(options) {
|
|
143
|
+
const { record, upstreamFiles, toVersion, fsPort, write = false, gate, labels } = options;
|
|
144
|
+
const fromVersion = record.templateVersion;
|
|
145
|
+
const files = [];
|
|
146
|
+
const conflicts = [];
|
|
147
|
+
const nextFiles = { ...record.files };
|
|
148
|
+
for (const upstream of upstreamFiles) {
|
|
149
|
+
const stamped = record.files[upstream.path];
|
|
150
|
+
const exists = fsPort.exists(upstream.path);
|
|
151
|
+
// Nieuw upstream-bestand (nog niet gematerialiseerd) of ontbrekend in het project → toevoegen.
|
|
152
|
+
if (stamped === undefined || !exists) {
|
|
153
|
+
files.push({ path: upstream.path, status: 'added', contents: upstream.contents, conflict: false });
|
|
154
|
+
if (write)
|
|
155
|
+
fsPort.write(upstream.path, upstream.contents);
|
|
156
|
+
nextFiles[upstream.path] = { templateVersion: toVersion, base: upstream.contents };
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const current = fsPort.read(upstream.path);
|
|
160
|
+
const merge = mergeSurface({ base: stamped.base, upstream: upstream.contents, current, labels });
|
|
161
|
+
files.push({ path: upstream.path, status: merge.status, contents: merge.contents, conflict: merge.conflict });
|
|
162
|
+
if (merge.conflict) {
|
|
163
|
+
conflicts.push(upstream.path);
|
|
164
|
+
// Conflict: niet schrijven, oud stempel behouden tot reconciliatie.
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (write)
|
|
168
|
+
fsPort.write(upstream.path, merge.contents);
|
|
169
|
+
// Schoon/gemerged: stempel de nieuwe versie en leg de nieuwe basis vast voor volgende upgrades.
|
|
170
|
+
nextFiles[upstream.path] = { templateVersion: toVersion, base: merge.contents };
|
|
171
|
+
}
|
|
172
|
+
const gateOutcome = gate ? gate(files) : undefined;
|
|
173
|
+
const safe = conflicts.length === 0 && (gateOutcome ? gateOutcome.ok : true);
|
|
174
|
+
return {
|
|
175
|
+
fromVersion,
|
|
176
|
+
toVersion,
|
|
177
|
+
files,
|
|
178
|
+
conflicts,
|
|
179
|
+
safe,
|
|
180
|
+
gate: gateOutcome,
|
|
181
|
+
record: { module: record.module, templateVersion: safe ? toVersion : fromVersion, files: nextFiles },
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=three-way-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-way-merge.js","sourceRoot":"","sources":["../../../scaffolder/core/three-way-merge.ts"],"names":[],"mappings":"AAmCA,MAAM,cAAc,GAAsB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAqBrG;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,cAAc,CAAC;IAE9C,kGAAkG;IAClG,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,wEAAwE;QACxE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,qEAAqE;QACrE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,gEAAgE;QAChE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,uCAAuC;IACvC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAC7C,UAAU,CAAC,IAAI,CAAC,EAChB,UAAU,CAAC,OAAO,CAAC,EACnB,UAAU,CAAC,QAAQ,CAAC,EACpB,MAAM,CACP,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,MAAM,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;QAC7C,QAAQ;QACR,QAAQ,EAAE,SAAS,GAAG,CAAC;QACvB,SAAS;KACV,CAAC;AACJ,CAAC;AAED,8FAA8F;AAC9F,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,kCAAkC;AAClC,SAAS,UAAU,CAAC,CAAoB,EAAE,CAAoB;IAC5D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,CAAoB,EAAE,CAAoB;IAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC;YAC5C,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4DAA4D;AAC5D,SAAS,QAAQ,CAAC,KAA8B;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,IAAuB,EACvB,OAA0B,EAC1B,QAA2B,EAC3B,MAAyB;IAEzB,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,uBAAuB;IAC/E,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,wBAAwB;IAElF,MAAM,OAAO,GAA+C,EAAE,CAAC;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAQ,EAAE;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAExF,IAAI,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,2BAA2B;QACvD,CAAC;aAAM,IAAI,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,0BAA0B;QACrD,CAAC;aAAM,IAAI,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,2BAA2B;QACtD,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CACN,WAAW,MAAM,CAAC,OAAO,EAAE,EAC3B,GAAG,UAAU,EACb,WAAW,MAAM,CAAC,IAAI,EAAE,EACxB,GAAG,OAAO,EACV,SAAS,EACT,GAAG,WAAW,EACd,WAAW,MAAM,CAAC,QAAQ,EAAE,CAC7B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,0CAA0C;QACrE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACd,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACd,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,uCAAuC;IACvC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE1D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAmED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1F,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;IAE3C,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAqC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAExE,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE5C,+FAA+F;QAC/F,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACnG,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1D,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnF,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE9G,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,oEAAoE;YACpE,SAAS;QACX,CAAC;QAED,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,gGAAgG;QAChG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE7E,OAAO;QACL,WAAW;QACX,SAAS;QACT,KAAK;QACL,SAAS;QACT,IAAI;QACJ,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;KACrG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scaffolder (authorization) — de version-aware materializer van de authorization-capability-module.
|
|
3
|
+
*
|
|
4
|
+
* Composeert het manifest (US-Z0801/0802) tot een werkende generate + upgrade-merge, en levert de
|
|
5
|
+
* divergentie-ladder niveau 1–3 (configureren, uitbreiden, materialiseren & mergen). Nieuw t.o.v. de
|
|
6
|
+
* authentication-tier: de module→module presence-check (US-Z0803), want dit is de eerste module die
|
|
7
|
+
* van een ándere capability-module afhangt. Alle core-functies zijn puur/deterministisch; het
|
|
8
|
+
* wegschrijven en inlezen gaat via een geïnjecteerde fs-port. Geen module-globale mutable state, geen
|
|
9
|
+
* echt filesystem. Dit is een build/dev-tool, geen runtime-mechanisme.
|
|
10
|
+
*/
|
|
11
|
+
export type { FileDescriptor, AuthzScaffolderFsPort, MemoryFsPort } from './core/ports.js';
|
|
12
|
+
export { createMemoryFsPort } from './core/ports.js';
|
|
13
|
+
export { materializeAuthzModule, stampedVersions } from './core/materialize.js';
|
|
14
|
+
export type { MaterializeOptions, MaterializeResult, MaterializationRecord, MaterializedFile, } from './core/materialize.js';
|
|
15
|
+
export { mergeSurface, upgradeSurface } from './core/three-way-merge.js';
|
|
16
|
+
export type { MergeStatus, MergeInput, MergeResult, MergeMarkerLabels, UpgradeOptions, UpgradeResult, FileUpgradeOutcome, AcceptanceGate, GateOutcome, } from './core/three-way-merge.js';
|
|
17
|
+
export { checkRequiredModules, assertAssemblable } from './core/presence.js';
|
|
18
|
+
export type { AssemblableOptions } from './core/presence.js';
|
|
19
|
+
export { resolveAuthzConfig, filterSurfaceByConfig, authzConfigSchema } from './core/config.js';
|
|
20
|
+
export type { EffectiveAuthzConfig, ResolvedAuthzConfig, AffectedSurface, } from './core/config.js';
|
|
21
|
+
export { definePermissionExtension, createPolicyHookRegistry, defineRelationResolver, } from './core/extend.js';
|
|
22
|
+
export type { PolicyDecisionContext, PolicyHook, PolicyHookRunResult, PolicyHookRegistry, RelationResolverSpec, RelationResolverInput, RelationResolverDescriptor, } from './core/extend.js';
|
|
23
|
+
export { AuthzMaterializationConflictError, MissingRequiredPortError, MissingRequiredModuleError, AuthzConfigValidationError, } from './core/errors.js';
|
|
24
|
+
export type { AuthzConfigViolation } from './core/errors.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../scaffolder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAChF,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACzE,YAAY,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAChG,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,iCAAiC,EACjC,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
|