@auto-engineer/model-diff 1.12.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 (57) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-test.log +14 -0
  3. package/.turbo/turbo-type-check.log +4 -0
  4. package/CHANGELOG.md +17 -0
  5. package/LICENSE +10 -0
  6. package/dist/src/change-detector.d.ts +17 -0
  7. package/dist/src/change-detector.d.ts.map +1 -0
  8. package/dist/src/change-detector.js +37 -0
  9. package/dist/src/change-detector.js.map +1 -0
  10. package/dist/src/commands/detect-changes.d.ts +8 -0
  11. package/dist/src/commands/detect-changes.d.ts.map +1 -0
  12. package/dist/src/commands/detect-changes.js +72 -0
  13. package/dist/src/commands/detect-changes.js.map +1 -0
  14. package/dist/src/fingerprint.d.ts +19 -0
  15. package/dist/src/fingerprint.d.ts.map +1 -0
  16. package/dist/src/fingerprint.js +38 -0
  17. package/dist/src/fingerprint.js.map +1 -0
  18. package/dist/src/generation-state.d.ts +11 -0
  19. package/dist/src/generation-state.d.ts.map +1 -0
  20. package/dist/src/generation-state.js +33 -0
  21. package/dist/src/generation-state.js.map +1 -0
  22. package/dist/src/index.d.ts +12 -0
  23. package/dist/src/index.d.ts.map +1 -0
  24. package/dist/src/index.js +4 -0
  25. package/dist/src/index.js.map +1 -0
  26. package/dist/src/model-dependencies.d.ts +26 -0
  27. package/dist/src/model-dependencies.d.ts.map +1 -0
  28. package/dist/src/model-dependencies.js +130 -0
  29. package/dist/src/model-dependencies.js.map +1 -0
  30. package/dist/src/stable-stringify.d.ts +2 -0
  31. package/dist/src/stable-stringify.d.ts.map +1 -0
  32. package/dist/src/stable-stringify.js +19 -0
  33. package/dist/src/stable-stringify.js.map +1 -0
  34. package/dist/src/utils.d.ts +2 -0
  35. package/dist/src/utils.d.ts.map +1 -0
  36. package/dist/src/utils.js +7 -0
  37. package/dist/src/utils.js.map +1 -0
  38. package/dist/tsconfig.tsbuildinfo +1 -0
  39. package/ketchup-plan.md +19 -0
  40. package/package.json +32 -0
  41. package/src/change-detector.specs.ts +138 -0
  42. package/src/change-detector.ts +65 -0
  43. package/src/commands/detect-changes.specs.ts +190 -0
  44. package/src/commands/detect-changes.ts +112 -0
  45. package/src/fingerprint.specs.ts +213 -0
  46. package/src/fingerprint.ts +59 -0
  47. package/src/generation-state.specs.ts +89 -0
  48. package/src/generation-state.ts +46 -0
  49. package/src/index.ts +7 -0
  50. package/src/model-dependencies.specs.ts +455 -0
  51. package/src/model-dependencies.ts +136 -0
  52. package/src/stable-stringify.specs.ts +45 -0
  53. package/src/stable-stringify.ts +19 -0
  54. package/src/utils.specs.ts +24 -0
  55. package/src/utils.ts +6 -0
  56. package/tsconfig.json +10 -0
  57. package/vitest.config.ts +21 -0
@@ -0,0 +1,5 @@
1
+
2
+ > @auto-engineer/model-diff@1.12.0 build /home/runner/work/auto-engineer/auto-engineer/packages/model-diff
3
+ > tsc && tsx ../../scripts/fix-esm-imports.ts
4
+
5
+ Fixed ESM imports in dist/
@@ -0,0 +1,14 @@
1
+
2
+ > @auto-engineer/model-diff@1.12.0 test /home/runner/work/auto-engineer/auto-engineer/packages/model-diff
3
+ > vitest run --reporter=dot --passWithNoTests
4
+
5
+
6
+  RUN  v3.2.4 /home/runner/work/auto-engineer/auto-engineer/packages/model-diff
7
+
8
+ ·····································································
9
+
10
+  Test Files  7 passed (7)
11
+  Tests  69 passed (69)
12
+  Start at  18:39:47
13
+  Duration  4.09s (transform 1.06s, setup 0ms, collect 1.97s, tests 450ms, environment 2ms, prepare 3.28s)
14
+
@@ -0,0 +1,4 @@
1
+
2
+ > @auto-engineer/model-diff@1.12.0 type-check /home/runner/work/auto-engineer/auto-engineer/packages/model-diff
3
+ > tsc --noEmit
4
+
package/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # @auto-engineer/model-diff
2
+
3
+ ## 1.12.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`a425971`](https://github.com/BeOnAuto/auto-engineer/commit/a4259717bdd3bd1c9f0194c9c33c46bbff510f00) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - **packages/narrative**: add @auto-engineer/narrative/schema subpath export
8
+ - **packages/model-diff**: new package for model-level change detection (incremental generation)
9
+ - **packages/server-generator-apollo-emmett**: add incremental generation support via model-diff change sets
10
+ - **global**: version packages
11
+ - **global**: add changeset
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [[`a425971`](https://github.com/BeOnAuto/auto-engineer/commit/a4259717bdd3bd1c9f0194c9c33c46bbff510f00)]:
16
+ - @auto-engineer/message-bus@1.12.0
17
+ - @auto-engineer/narrative@1.12.0
package/LICENSE ADDED
@@ -0,0 +1,10 @@
1
+ Elastic License 2.0
2
+
3
+ Copyright 2024 Sam Hatoum
4
+
5
+ This software and associated documentation files (the "Software") are licensed under the Elastic License 2.0 (the "License"). You may not use this file except in compliance with the License.
6
+
7
+ You may obtain a copy of the License at:
8
+ https://www.elastic.co/licensing/elastic-license
9
+
10
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
@@ -0,0 +1,17 @@
1
+ import type { SliceSnapshot } from './fingerprint';
2
+ import type { GenerationState } from './generation-state';
3
+ export type SliceDelta = {
4
+ type: 'added' | 'removed' | 'changed';
5
+ previous?: SliceSnapshot;
6
+ current?: SliceSnapshot;
7
+ };
8
+ export type ChangeSet = {
9
+ added: string[];
10
+ removed: string[];
11
+ changed: string[];
12
+ sharedTypesChanged: boolean;
13
+ allAffected: string[];
14
+ deltas: Record<string, SliceDelta>;
15
+ };
16
+ export declare function computeChangeSet(previousState: GenerationState | null, currentFingerprints: Record<string, string>, currentSnapshots: Record<string, SliceSnapshot>, currentSharedTypesHash: string): ChangeSet;
17
+ //# sourceMappingURL=change-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detector.d.ts","sourceRoot":"","sources":["../../src/change-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,eAAe,GAAG,IAAI,EACrC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,sBAAsB,EAAE,MAAM,GAC7B,SAAS,CAyCX"}
@@ -0,0 +1,37 @@
1
+ export function computeChangeSet(previousState, currentFingerprints, currentSnapshots, currentSharedTypesHash) {
2
+ const prevFingerprints = previousState?.sliceFingerprints ?? {};
3
+ const prevSnapshots = previousState?.sliceSnapshots ?? {};
4
+ const prevSharedHash = previousState?.sharedTypesHash ?? '';
5
+ const currentIds = new Set(Object.keys(currentFingerprints));
6
+ const previousIds = new Set(Object.keys(prevFingerprints));
7
+ const added = [];
8
+ const removed = [];
9
+ const changed = [];
10
+ const deltas = {};
11
+ for (const id of currentIds) {
12
+ if (!previousIds.has(id)) {
13
+ added.push(id);
14
+ deltas[id] = { type: 'added', current: currentSnapshots[id] };
15
+ }
16
+ else if (currentFingerprints[id] !== prevFingerprints[id]) {
17
+ changed.push(id);
18
+ deltas[id] = { type: 'changed', previous: prevSnapshots[id], current: currentSnapshots[id] };
19
+ }
20
+ }
21
+ for (const id of previousIds) {
22
+ if (!currentIds.has(id)) {
23
+ removed.push(id);
24
+ deltas[id] = { type: 'removed', previous: prevSnapshots[id] };
25
+ }
26
+ }
27
+ const sharedTypesChanged = currentSharedTypesHash !== prevSharedHash;
28
+ const affectedSet = new Set([...added, ...changed]);
29
+ if (sharedTypesChanged) {
30
+ for (const id of currentIds) {
31
+ affectedSet.add(id);
32
+ }
33
+ }
34
+ const allAffected = [...affectedSet];
35
+ return { added, removed, changed, sharedTypesChanged, allAffected, deltas };
36
+ }
37
+ //# sourceMappingURL=change-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detector.js","sourceRoot":"","sources":["../../src/change-detector.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,gBAAgB,CAC9B,aAAqC,EACrC,mBAA2C,EAC3C,gBAA+C,EAC/C,sBAA8B;IAE9B,MAAM,gBAAgB,GAAG,aAAa,EAAE,iBAAiB,IAAI,EAAE,CAAC;IAChE,MAAM,aAAa,GAAG,aAAa,EAAE,cAAc,IAAI,EAAE,CAAC;IAC1D,MAAM,cAAc,GAAG,aAAa,EAAE,eAAe,IAAI,EAAE,CAAC;IAE5D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAA+B,EAAE,CAAC;IAE9C,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;aAAM,IAAI,mBAAmB,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,sBAAsB,KAAK,cAAc,CAAC;IAErE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IACpD,IAAI,kBAAkB,EAAE,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IAErC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const commandHandler: import("@auto-engineer/message-bus").UnifiedCommandHandler<Readonly<{
2
+ type: string;
3
+ data: Readonly<Record<string, unknown>>;
4
+ timestamp?: Date;
5
+ requestId?: string;
6
+ correlationId?: string;
7
+ }>>;
8
+ //# sourceMappingURL=detect-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-changes.d.ts","sourceRoot":"","sources":["../../../src/commands/detect-changes.ts"],"names":[],"mappings":"AA0CA,eAAO,MAAM,cAAc;;;;;;GAqEzB,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { defineCommandHandler } from '@auto-engineer/message-bus';
4
+ import { computeChangeSet } from '../change-detector.js';
5
+ import { computeAllFingerprints, computeAllSnapshots } from '../fingerprint.js';
6
+ import { loadGenerationState } from '../generation-state.js';
7
+ import { computeSharedTypesHash } from '../model-dependencies.js';
8
+ export const commandHandler = defineCommandHandler({
9
+ name: 'DetectChanges',
10
+ displayName: 'Detect Changes',
11
+ alias: 'detect:changes',
12
+ description: 'Detect model-level changes between pipeline runs',
13
+ category: 'generate',
14
+ icon: 'diff',
15
+ events: [
16
+ { name: 'ChangesDetected', displayName: 'Changes Detected' },
17
+ { name: 'ChangeDetectionFailed', displayName: 'Change Detection Failed' },
18
+ ],
19
+ fields: {
20
+ modelPath: { description: 'Path to the JSON model file', required: true },
21
+ destination: { description: 'Project root directory', required: true },
22
+ force: { description: 'Force full regeneration (treat as first run)' },
23
+ },
24
+ examples: ['$ auto detect:changes --model-path=.context/schema.json --destination=.'],
25
+ handle: async (command) => {
26
+ const typed = command;
27
+ const { modelPath, destination, force } = typed.data;
28
+ try {
29
+ const absModel = resolve(modelPath);
30
+ const absDest = resolve(destination);
31
+ const content = await readFile(absModel, 'utf8');
32
+ const model = JSON.parse(content);
33
+ const previousState = force ? null : await loadGenerationState(absDest);
34
+ const isFirstRun = previousState === null;
35
+ const snapshots = computeAllSnapshots(model);
36
+ const fingerprints = computeAllFingerprints(snapshots);
37
+ const sharedTypesHash = computeSharedTypesHash(model.messages);
38
+ const changeSet = computeChangeSet(previousState, fingerprints, snapshots, sharedTypesHash);
39
+ const newState = {
40
+ version: 1,
41
+ timestamp: new Date().toISOString(),
42
+ sliceFingerprints: fingerprints,
43
+ sliceSnapshots: snapshots,
44
+ sharedTypesHash,
45
+ };
46
+ const contextDir = join(absDest, '.context');
47
+ await mkdir(contextDir, { recursive: true });
48
+ await writeFile(join(contextDir, '.change-set.json'), JSON.stringify(changeSet, null, 2), 'utf8');
49
+ return {
50
+ type: 'ChangesDetected',
51
+ data: { modelPath, destination, changeSet, isFirstRun, newState },
52
+ timestamp: new Date(),
53
+ requestId: typed.requestId,
54
+ correlationId: typed.correlationId,
55
+ };
56
+ }
57
+ catch (error) {
58
+ return {
59
+ type: 'ChangeDetectionFailed',
60
+ data: {
61
+ modelPath,
62
+ destination,
63
+ error: error instanceof Error ? error.message : 'Unknown error',
64
+ },
65
+ timestamp: new Date(),
66
+ requestId: typed.requestId,
67
+ correlationId: typed.correlationId,
68
+ };
69
+ }
70
+ },
71
+ });
72
+ //# sourceMappingURL=detect-changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-changes.js","sourceRoot":"","sources":["../../../src/commands/detect-changes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Message, Model, Slice } from '@auto-engineer/narrative';
2
+ type SourceLocation = {
3
+ flowName: string;
4
+ sliceName: string;
5
+ };
6
+ export type SliceSnapshot = {
7
+ slice: Slice;
8
+ flowName: string;
9
+ referencedMessages: Message[];
10
+ eventSources: Record<string, SourceLocation>;
11
+ commandSources: Record<string, SourceLocation>;
12
+ referencedIntegrations?: Model['integrations'];
13
+ };
14
+ export declare function buildSliceSnapshot(slice: Slice, flowName: string, model: Model): SliceSnapshot;
15
+ export declare function computeFingerprintFromSnapshot(snapshot: SliceSnapshot): string;
16
+ export declare function computeAllSnapshots(model: Model): Record<string, SliceSnapshot>;
17
+ export declare function computeAllFingerprints(snapshots: Record<string, SliceSnapshot>): Record<string, string>;
18
+ export {};
19
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/fingerprint.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAUtE,KAAK,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,sBAAsB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAW9F;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAI9E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAS/E;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMvG"}
@@ -0,0 +1,38 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { getCommandSourceMap, getEventSourceMap, getReferencedIntegrations, getReferencedMessageNames, } from './model-dependencies.js';
3
+ import { stableStringify } from './stable-stringify.js';
4
+ import { toKebabCase } from './utils.js';
5
+ export function buildSliceSnapshot(slice, flowName, model) {
6
+ const messageNames = getReferencedMessageNames(slice);
7
+ const referencedMessages = messageNames
8
+ .map((name) => model.messages.find((m) => m.name === name))
9
+ .filter((m) => m !== undefined)
10
+ .sort((a, b) => a.name.localeCompare(b.name));
11
+ const eventSources = getEventSourceMap(slice, model.narratives);
12
+ const commandSources = getCommandSourceMap(slice, model.narratives);
13
+ const referencedIntegrations = getReferencedIntegrations(slice, model.integrations);
14
+ return { slice, flowName, referencedMessages, eventSources, commandSources, referencedIntegrations };
15
+ }
16
+ export function computeFingerprintFromSnapshot(snapshot) {
17
+ const hash = createHash('sha256');
18
+ hash.update(stableStringify(snapshot));
19
+ return hash.digest('hex');
20
+ }
21
+ export function computeAllSnapshots(model) {
22
+ const snapshots = {};
23
+ for (const narrative of model.narratives) {
24
+ for (const slice of narrative.slices) {
25
+ const sliceId = `${toKebabCase(narrative.name)}/${toKebabCase(slice.name)}`;
26
+ snapshots[sliceId] = buildSliceSnapshot(slice, narrative.name, model);
27
+ }
28
+ }
29
+ return snapshots;
30
+ }
31
+ export function computeAllFingerprints(snapshots) {
32
+ const fingerprints = {};
33
+ for (const [sliceId, snapshot] of Object.entries(snapshots)) {
34
+ fingerprints[sliceId] = computeFingerprintFromSnapshot(snapshot);
35
+ }
36
+ return fingerprints;
37
+ }
38
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAatC,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,QAAgB,EAAE,KAAY;IAC7E,MAAM,YAAY,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,YAAY;SACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;SAC1D,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,MAAM,sBAAsB,GAAG,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAEpF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,QAAuB;IACpE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAY;IAC9C,MAAM,SAAS,GAAkC,EAAE,CAAC;IACpD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5E,SAAS,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAwC;IAC7E,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,YAAY,CAAC,OAAO,CAAC,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SliceSnapshot } from './fingerprint';
2
+ export type GenerationState = {
3
+ version: 1;
4
+ timestamp: string;
5
+ sliceFingerprints: Record<string, string>;
6
+ sliceSnapshots: Record<string, SliceSnapshot>;
7
+ sharedTypesHash: string;
8
+ };
9
+ export declare function loadGenerationState(destination: string): Promise<GenerationState | null>;
10
+ export declare function saveGenerationState(destination: string, state: GenerationState): Promise<void>;
11
+ //# sourceMappingURL=generation-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-state.d.ts","sourceRoot":"","sources":["../../src/generation-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAoBF,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAS9F;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpG"}
@@ -0,0 +1,33 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ const STATE_VERSION = 1;
4
+ function statePath(destination) {
5
+ return join(destination, '.context', '.generation-state.json');
6
+ }
7
+ function isGenerationState(value) {
8
+ return (value.version === STATE_VERSION &&
9
+ typeof value.timestamp === 'string' &&
10
+ typeof value.sliceFingerprints === 'object' &&
11
+ value.sliceFingerprints !== null &&
12
+ typeof value.sliceSnapshots === 'object' &&
13
+ value.sliceSnapshots !== null &&
14
+ typeof value.sharedTypesHash === 'string');
15
+ }
16
+ export async function loadGenerationState(destination) {
17
+ try {
18
+ const content = await readFile(statePath(destination), 'utf8');
19
+ const parsed = JSON.parse(content);
20
+ if (!isGenerationState(parsed))
21
+ return null;
22
+ return parsed;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ export async function saveGenerationState(destination, state) {
29
+ const filePath = statePath(destination);
30
+ await mkdir(dirname(filePath), { recursive: true });
31
+ await writeFile(filePath, JSON.stringify(state, null, 2), 'utf8');
32
+ }
33
+ //# sourceMappingURL=generation-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-state.js","sourceRoot":"","sources":["../../src/generation-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAW1C,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA8B;IACvD,OAAO,CACL,KAAK,CAAC,OAAO,KAAK,aAAa;QAC/B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ;QAC3C,KAAK,CAAC,iBAAiB,KAAK,IAAI;QAChC,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QACxC,KAAK,CAAC,cAAc,KAAK,IAAI;QAC7B,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAC1C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC9D,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,KAAsB;IACnF,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare const COMMANDS: import("@auto-engineer/message-bus").UnifiedCommandHandler<Readonly<{
2
+ type: string;
3
+ data: Readonly<Record<string, unknown>>;
4
+ timestamp?: Date;
5
+ requestId?: string;
6
+ correlationId?: string;
7
+ }>>[];
8
+ export type { ChangeSet, SliceDelta } from './change-detector';
9
+ export type { SliceSnapshot } from './fingerprint';
10
+ export type { GenerationState } from './generation-state';
11
+ export { saveGenerationState } from './generation-state';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;;;;KAAyB,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { commandHandler as detectChangesHandler } from './commands/detect-changes.js';
2
+ export const COMMANDS = [detectChangesHandler];
3
+ export { saveGenerationState } from './generation-state.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEnF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAI/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Model, Narrative, Slice, Spec } from '@auto-engineer/narrative';
2
+ type StepBuckets = {
3
+ given: string[];
4
+ when: string[];
5
+ then: string[];
6
+ };
7
+ export declare function walkStepsByKeyword(specs: Spec[]): StepBuckets;
8
+ export declare function getReferencedMessageNames(slice: Slice): string[];
9
+ export declare function findEventSource(flows: Narrative[], eventName: string): {
10
+ flowName: string;
11
+ sliceName: string;
12
+ } | null;
13
+ export declare function findCommandSource(flows: Narrative[], commandName: string): {
14
+ flowName: string;
15
+ sliceName: string;
16
+ } | null;
17
+ type SourceLocation = {
18
+ flowName: string;
19
+ sliceName: string;
20
+ };
21
+ export declare function getEventSourceMap(slice: Slice, flows: Narrative[]): Record<string, SourceLocation>;
22
+ export declare function getCommandSourceMap(slice: Slice, flows: Narrative[]): Record<string, SourceLocation>;
23
+ export declare function getReferencedIntegrations(slice: Slice, integrations?: Model['integrations']): Model['integrations'];
24
+ export declare function computeSharedTypesHash(messages: Model['messages']): string;
25
+ export {};
26
+ //# sourceMappingURL=model-dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-dependencies.d.ts","sourceRoot":"","sources":["../../src/model-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAE9E,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAyB7D;AAOD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAahE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWrH;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWhD;AAED,KAAK,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAmBlG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAapG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,CAKnH;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAU1E"}
@@ -0,0 +1,130 @@
1
+ export function walkStepsByKeyword(specs) {
2
+ const given = new Set();
3
+ const when = new Set();
4
+ const then = new Set();
5
+ for (const spec of specs) {
6
+ for (const rule of spec.rules) {
7
+ for (const example of rule.examples) {
8
+ let lastMajor = 'given';
9
+ for (const step of example.steps) {
10
+ if (!('text' in step))
11
+ continue;
12
+ const keyword = step.keyword;
13
+ if (keyword === 'Given')
14
+ lastMajor = 'given';
15
+ else if (keyword === 'When')
16
+ lastMajor = 'when';
17
+ else if (keyword === 'Then')
18
+ lastMajor = 'then';
19
+ const bucket = keyword === 'And' ? lastMajor : keyword.toLowerCase();
20
+ if (bucket === 'given')
21
+ given.add(step.text);
22
+ else if (bucket === 'when')
23
+ when.add(step.text);
24
+ else
25
+ then.add(step.text);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ return { given: [...given], when: [...when], then: [...then] };
31
+ }
32
+ function getServerSpecs(slice) {
33
+ if ('server' in slice && slice.server)
34
+ return slice.server.specs;
35
+ return [];
36
+ }
37
+ export function getReferencedMessageNames(slice) {
38
+ const names = new Set();
39
+ const specs = getServerSpecs(slice);
40
+ const buckets = walkStepsByKeyword(specs);
41
+ for (const text of [...buckets.given, ...buckets.when, ...buckets.then]) {
42
+ names.add(text);
43
+ }
44
+ if ('server' in slice && slice.server?.data?.items) {
45
+ for (const item of slice.server.data.items) {
46
+ names.add(item.target.name);
47
+ }
48
+ }
49
+ return [...names];
50
+ }
51
+ export function findEventSource(flows, eventName) {
52
+ for (const flow of flows) {
53
+ for (const slice of flow.slices) {
54
+ if (slice.type !== 'command')
55
+ continue;
56
+ const buckets = walkStepsByKeyword(slice.server.specs);
57
+ if (buckets.then.includes(eventName)) {
58
+ return { flowName: flow.name, sliceName: slice.name };
59
+ }
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ export function findCommandSource(flows, commandName) {
65
+ for (const flow of flows) {
66
+ for (const slice of flow.slices) {
67
+ if (slice.type !== 'command')
68
+ continue;
69
+ const buckets = walkStepsByKeyword(slice.server.specs);
70
+ if (buckets.when.includes(commandName)) {
71
+ return { flowName: flow.name, sliceName: slice.name };
72
+ }
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ export function getEventSourceMap(slice, flows) {
78
+ const specs = getServerSpecs(slice);
79
+ if (specs.length === 0)
80
+ return {};
81
+ const buckets = walkStepsByKeyword(specs);
82
+ const consumedEvents = [];
83
+ if (slice.type === 'command') {
84
+ consumedEvents.push(...buckets.given);
85
+ }
86
+ else if (slice.type === 'react' || slice.type === 'query') {
87
+ consumedEvents.push(...buckets.given, ...buckets.when);
88
+ }
89
+ const result = {};
90
+ for (const eventName of consumedEvents) {
91
+ const source = findEventSource(flows, eventName);
92
+ if (source)
93
+ result[eventName] = source;
94
+ }
95
+ return result;
96
+ }
97
+ export function getCommandSourceMap(slice, flows) {
98
+ if (slice.type !== 'react')
99
+ return {};
100
+ const specs = getServerSpecs(slice);
101
+ if (specs.length === 0)
102
+ return {};
103
+ const buckets = walkStepsByKeyword(specs);
104
+ const result = {};
105
+ for (const cmdName of buckets.then) {
106
+ const source = findCommandSource(flows, cmdName);
107
+ if (source)
108
+ result[cmdName] = source;
109
+ }
110
+ return result;
111
+ }
112
+ export function getReferencedIntegrations(slice, integrations) {
113
+ if (!integrations || !slice.via || slice.via.length === 0)
114
+ return undefined;
115
+ const viaSet = new Set(slice.via);
116
+ const filtered = integrations.filter((i) => viaSet.has(i.name));
117
+ return filtered.length > 0 ? filtered : undefined;
118
+ }
119
+ export function computeSharedTypesHash(messages) {
120
+ const unionFields = [];
121
+ for (const msg of messages) {
122
+ for (const field of msg.fields) {
123
+ if (field.type.includes("'") && field.type.includes('|')) {
124
+ unionFields.push(`${msg.name}.${field.name}:${field.type}`);
125
+ }
126
+ }
127
+ }
128
+ return unionFields.join('|');
129
+ }
130
+ //# sourceMappingURL=model-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-dependencies.js","sourceRoot":"","sources":["../../src/model-dependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function stableStringify(value: unknown): string;
2
+ //# sourceMappingURL=stable-stringify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-stringify.d.ts","sourceRoot":"","sources":["../../src/stable-stringify.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkBtD"}
@@ -0,0 +1,19 @@
1
+ export function stableStringify(value) {
2
+ if (value === null || typeof value !== 'object') {
3
+ return JSON.stringify(value);
4
+ }
5
+ if (Array.isArray(value)) {
6
+ return `[${value.map((item) => stableStringify(item)).join(',')}]`;
7
+ }
8
+ const obj = value;
9
+ const sortedKeys = Object.keys(obj).sort();
10
+ const parts = [];
11
+ for (const key of sortedKeys) {
12
+ const val = obj[key];
13
+ if (val === undefined)
14
+ continue;
15
+ parts.push(`${JSON.stringify(key)}:${stableStringify(val)}`);
16
+ }
17
+ return `{${parts.join(',')}}`;
18
+ }
19
+ //# sourceMappingURL=stable-stringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-stringify.js","sourceRoot":"","sources":["../../src/stable-stringify.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACrE,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function toKebabCase(str: string): string;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C"}
@@ -0,0 +1,7 @@
1
+ export function toKebabCase(str) {
2
+ return str
3
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
4
+ .replace(/\s+/g, '-')
5
+ .toLowerCase();
6
+ }
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,WAAW,EAAE,CAAC;AACnB,CAAC"}