@mpfrontend/ftg-cli 0.0.0-stage → 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/dist/index.js ADDED
@@ -0,0 +1,185 @@
1
+ import { readFile, writeFile, mkdir, realpath, lstat, rename, unlink } from 'node:fs/promises';
2
+ import { dirname, resolve, relative, isAbsolute, join } from 'node:path';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import SwaggerParser from '@apidevtools/swagger-parser';
5
+ import { parse } from 'yaml';
6
+ import { normalizeResources, normalizeRequests } from '@mpfrontend/ftg-core';
7
+ import { readModelOutputs, requestModelOutputs } from './read-models.js';
8
+ export const GENERATOR_VERSION = '0.1.0-dev.6';
9
+ export const digest = (value) => createHash('sha256').update(value).digest('hex');
10
+ export class InputError extends Error {
11
+ exitCode;
12
+ constructor(message, exitCode = 2) {
13
+ super(message);
14
+ this.exitCode = exitCode;
15
+ }
16
+ }
17
+ const HEADER = '// @generated by FTG; edit authored overrides instead.\n';
18
+ function containsExternalRef(value) {
19
+ if (!value || typeof value !== 'object')
20
+ return false;
21
+ if (Array.isArray(value))
22
+ return value.some(containsExternalRef);
23
+ const object = value;
24
+ if (typeof object.$ref === 'string' && !object.$ref.startsWith('#/'))
25
+ return true;
26
+ return Object.values(object).some(containsExternalRef);
27
+ }
28
+ export async function loadContract(path) {
29
+ const bytes = await readFile(path, 'utf8');
30
+ if (Buffer.byteLength(bytes) > 5 * 1024 * 1024)
31
+ throw new InputError('CONTRACT_TOO_LARGE');
32
+ const document = parse(bytes);
33
+ if (!document || typeof document.openapi !== 'string' || !document.openapi.startsWith('3.'))
34
+ throw new InputError('INVALID_OPENAPI');
35
+ if (containsExternalRef(document))
36
+ throw new InputError('EXTERNAL_REFS_REQUIRE_PINNED_BUNDLE');
37
+ await SwaggerParser.validate(document, { resolve: { external: false } });
38
+ return { document, bytes, hash: digest(bytes) };
39
+ }
40
+ async function safeOutput(base, output) {
41
+ const canonical = await realpath(base);
42
+ const target = resolve(canonical, output);
43
+ if (isAbsolute(output) || relative(canonical, target).startsWith('..') || target === canonical)
44
+ throw new InputError('OUTPUT_OUTSIDE_CONFIG_ROOT', 4);
45
+ let existing = target;
46
+ while (true) {
47
+ try {
48
+ const actual = await realpath(existing);
49
+ if (relative(canonical, actual).startsWith('..'))
50
+ throw new InputError('SYMLINK_OUTPUT_ESCAPE', 4);
51
+ break;
52
+ }
53
+ catch (error) {
54
+ if (error instanceof InputError)
55
+ throw error;
56
+ if (error.code !== 'ENOENT')
57
+ throw error;
58
+ existing = dirname(existing);
59
+ }
60
+ }
61
+ return target;
62
+ }
63
+ async function generatedFile(file) {
64
+ try {
65
+ if ((await lstat(file)).isSymbolicLink())
66
+ throw new InputError('GENERATED_FILE_SYMLINK', 4);
67
+ return await readFile(file, 'utf8');
68
+ }
69
+ catch (error) {
70
+ if (error.code === 'ENOENT')
71
+ return undefined;
72
+ throw error;
73
+ }
74
+ }
75
+ async function assertNoWriter(marker) {
76
+ try {
77
+ await lstat(marker);
78
+ throw new InputError('GENERATION_BUSY', 4);
79
+ }
80
+ catch (error) {
81
+ if (error.code !== 'ENOENT')
82
+ throw error;
83
+ }
84
+ }
85
+ export async function generate(configPath, { check = false, dryRun = false } = {}) {
86
+ const base = dirname(resolve(configPath));
87
+ const raw = JSON.parse(await readFile(configPath, 'utf8'));
88
+ if (typeof raw.openapi !== 'string' || typeof raw.output !== 'string' || !Array.isArray(raw.resources))
89
+ throw new InputError('INVALID_CONFIG');
90
+ if (raw.requests !== undefined && !Array.isArray(raw.requests))
91
+ throw new InputError('INVALID_REQUEST_CONFIG');
92
+ const output = await safeOutput(base, raw.output);
93
+ const { document, hash } = await loadContract(resolve(base, raw.openapi));
94
+ const resources = normalizeResources(document, raw.resources);
95
+ const requests = normalizeRequests(document, raw.requests ?? []);
96
+ const source = HEADER + 'import type { ResourceModel } from "@mpfrontend/ftg-core";\n' +
97
+ 'export const contractHash = ' + JSON.stringify(hash) + ';\n' +
98
+ 'export const resources = ' + JSON.stringify(resources, null, 2) + ' as const satisfies readonly ResourceModel[];\n';
99
+ const readers = Object.fromEntries(Object.entries(readModelOutputs(document, raw.resources)).map(([name, bytes]) => [name, HEADER + bytes]));
100
+ const requestSource = HEADER + 'import type { RequestModel } from "@mpfrontend/ftg-core";\n' +
101
+ 'export const contractHash = ' + JSON.stringify(hash) + ';\n' +
102
+ 'export const requests = ' + JSON.stringify(requests, null, 2) + ' as const satisfies readonly RequestModel[];\n';
103
+ const payloads = Object.fromEntries(Object.entries(requestModelOutputs(document, requests)).map(([name, bytes]) => [name, HEADER + bytes]));
104
+ const generated = { 'resources.gen.ts': source, ...readers, 'requests.gen.ts': requestSource, ...payloads };
105
+ const manifest = JSON.stringify({ generator: 'FTG', version: GENERATOR_VERSION, irVersion: 3, contractHash: hash,
106
+ files: Object.fromEntries(Object.entries(generated).map(([name, bytes]) => [name, digest(bytes)])) }, null, 2) + '\n';
107
+ const desired = { ...generated, 'generation-manifest.json': manifest };
108
+ const marker = join(output, '.ftg-write.lock'), writer = !check && !dryRun, owner = randomUUID();
109
+ await assertNoWriter(marker);
110
+ if (writer) {
111
+ await mkdir(output, { recursive: true });
112
+ try {
113
+ await writeFile(marker, owner, { flag: 'wx' });
114
+ }
115
+ catch (error) {
116
+ if (error.code === 'EEXIST')
117
+ throw new InputError('GENERATION_BUSY', 4);
118
+ throw error;
119
+ }
120
+ }
121
+ try {
122
+ const previous = new Map();
123
+ const changed = [];
124
+ for (const [name, content] of Object.entries(desired)) {
125
+ const file = join(output, name);
126
+ const old = await generatedFile(file);
127
+ if (old !== undefined && (name === 'generation-manifest.json' ? JSON.parse(old).generator !== 'FTG' : !old.startsWith(HEADER)))
128
+ throw new InputError('AUTHORED_FILE_COLLISION', 4);
129
+ previous.set(name, old);
130
+ if (old !== content)
131
+ changed.push(name);
132
+ }
133
+ if (check && changed.length)
134
+ throw new InputError('GENERATED_DRIFT', 3);
135
+ if (!check && !dryRun && changed.length) {
136
+ const staged = new Map();
137
+ const replaced = [];
138
+ try {
139
+ for (const name of changed) {
140
+ const stage = join(output, '.ftg-' + randomUUID());
141
+ await writeFile(stage, desired[name], { flag: 'wx' });
142
+ staged.set(name, stage);
143
+ }
144
+ for (const name of changed) {
145
+ if (await generatedFile(join(output, name)) !== previous.get(name))
146
+ throw new InputError('GENERATION_FILE_CHANGED', 4);
147
+ await rename(staged.get(name), join(output, name));
148
+ staged.delete(name);
149
+ replaced.push(name);
150
+ }
151
+ }
152
+ catch (error) {
153
+ let conflict = false;
154
+ for (const name of replaced) {
155
+ const file = join(output, name);
156
+ if (await generatedFile(file) !== desired[name]) {
157
+ conflict = true;
158
+ continue;
159
+ }
160
+ const old = previous.get(name);
161
+ if (old === undefined)
162
+ await unlink(file);
163
+ else
164
+ await writeFile(file, old);
165
+ }
166
+ if (conflict)
167
+ throw new InputError('GENERATION_ROLLBACK_CONFLICT', 4);
168
+ throw error;
169
+ }
170
+ finally {
171
+ for (const stage of staged.values())
172
+ await unlink(stage).catch(() => undefined);
173
+ }
174
+ }
175
+ if (!writer)
176
+ await assertNoWriter(marker);
177
+ return { ok: true, contractHash: hash, resources: resources.length, requests: requests.length, changed, dryRun, check };
178
+ }
179
+ finally {
180
+ // Never remove another writer's marker or a marker replaced by an authored symlink.
181
+ if (writer && await generatedFile(marker) === owner)
182
+ await unlink(marker);
183
+ }
184
+ }
185
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { OpenApiDocument, ResourceSelection, RequestModel } from '@mpfrontend/ftg-core';
2
+ export declare function readModelOutputs(document: OpenApiDocument, selections: readonly ResourceSelection[]): Record<string, string>;
3
+ export declare function requestModelOutputs(document: OpenApiDocument, requests: readonly RequestModel[]): Record<string, string>;
@@ -0,0 +1,207 @@
1
+ import { createRequire } from 'node:module';
2
+ import { resolveSchema } from '@mpfrontend/ftg-core';
3
+ const require = createRequire(import.meta.url);
4
+ const Ajv = require('ajv/dist/2020').Ajv2020;
5
+ const addFormats = require('ajv-formats');
6
+ const standalone = require('ajv/dist/standalone').default;
7
+ const annotations = new Set(['title', 'description', 'readOnly', 'writeOnly']);
8
+ function resolved(raw, document) {
9
+ if (raw.$ref && Object.keys(raw).some(key => key !== '$ref' && !annotations.has(key)))
10
+ throw new Error('UNSUPPORTED_SCHEMA_REFERENCE_SIBLINGS');
11
+ const value = resolveSchema(raw, document);
12
+ return { ...value, ...(raw.readOnly !== undefined ? { readOnly: raw.readOnly } : {}), ...(raw.writeOnly !== undefined ? { writeOnly: raw.writeOnly } : {}) };
13
+ }
14
+ // Finite read-model subset: never guess composition, recursive types or field transforms.
15
+ function readShape(raw, document, depth = 0, direction = 'read') {
16
+ if (depth > 32)
17
+ throw new Error('UNSUPPORTED_RECURSIVE_READ_SCHEMA');
18
+ const schema = resolved(raw, document);
19
+ if (schema.oneOf || schema.anyOf || schema.allOf)
20
+ throw new Error('UNSUPPORTED_READ_SCHEMA_UNION');
21
+ const next = { ...schema };
22
+ delete next.readOnly;
23
+ delete next.writeOnly;
24
+ if (direction === 'request' && (schema.type === 'object' || Array.isArray(schema.type) && schema.type.includes('object')) && schema.additionalProperties !== false)
25
+ throw new Error('REQUEST_OBJECT_MUST_DECLARE_CLOSED_PROPERTIES');
26
+ const excluded = (child) => direction === 'read' ? resolved(child, document).writeOnly : resolved(child, document).readOnly;
27
+ if (schema.properties) {
28
+ next.properties = Object.fromEntries(Object.entries(schema.properties).map(([key, child]) => [key,
29
+ excluded(child) ? { not: {} } : readShape(child, document, depth + 1, direction)]));
30
+ if (schema.required)
31
+ next.required = schema.required.filter(key => !excluded(schema.properties[key] ?? {}));
32
+ }
33
+ if (schema.items)
34
+ next.items = readShape(schema.items, document, depth + 1, direction);
35
+ if (typeof schema.additionalProperties === 'object')
36
+ next.additionalProperties = readShape(schema.additionalProperties, document, depth + 1, direction);
37
+ return next;
38
+ }
39
+ function readType(raw, document, depth = 0, direction = 'read') {
40
+ if (depth > 32)
41
+ throw new Error('UNSUPPORTED_RECURSIVE_READ_SCHEMA');
42
+ const schema = resolved(raw, document);
43
+ if (schema.oneOf || schema.anyOf || schema.allOf)
44
+ throw new Error('UNSUPPORTED_READ_SCHEMA_UNION');
45
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type];
46
+ const effective = types.filter(type => type !== 'null');
47
+ if (effective.length !== 1)
48
+ throw new Error('UNSUPPORTED_READ_SCHEMA_TYPE');
49
+ let type;
50
+ if (schema.enum) {
51
+ if (!schema.enum.length || schema.enum.some(value => value !== null && !['string', 'number', 'boolean'].includes(typeof value)))
52
+ throw new Error('UNSUPPORTED_READ_ENUM');
53
+ type = schema.enum.map(value => JSON.stringify(value)).join(' | ');
54
+ }
55
+ else
56
+ switch (effective[0]) {
57
+ case 'string':
58
+ case 'boolean':
59
+ type = effective[0];
60
+ break;
61
+ case 'number':
62
+ case 'integer':
63
+ type = 'number';
64
+ break;
65
+ case 'array':
66
+ if (!schema.items)
67
+ throw new Error('MISSING_ARRAY_ITEMS');
68
+ type = 'Array<' + readType(schema.items, document, depth + 1, direction) + '>';
69
+ break;
70
+ case 'object': {
71
+ const properties = Object.entries(schema.properties ?? {}).sort(([a], [b]) => a.localeCompare(b, 'en'))
72
+ .filter(([, child]) => direction === 'read' ? !resolved(child, document).writeOnly : !resolved(child, document).readOnly);
73
+ type = '{ ' + properties.map(([key, child]) => 'readonly ' + JSON.stringify(key) + (schema.required?.includes(key) ? '' : '?') + ': ' + readType(child, document, depth + 1, direction)).join('; ') + ' }';
74
+ if (typeof schema.additionalProperties === 'object') {
75
+ // Mixed fixed/index signatures can be incompatible in TypeScript; do not invent an intersection.
76
+ if (properties.length)
77
+ throw new Error('UNSUPPORTED_MIXED_READ_INDEX_SIGNATURE');
78
+ type = 'Record<string, ' + readType(schema.additionalProperties, document, depth + 1, direction) + '>';
79
+ }
80
+ else if (schema.additionalProperties !== false)
81
+ type += ' & Record<string, unknown>';
82
+ break;
83
+ }
84
+ default: throw new Error('UNSUPPORTED_READ_SCHEMA_TYPE');
85
+ }
86
+ return !schema.enum && (schema.nullable || types.includes('null')) ? type + ' | null' : type;
87
+ }
88
+ function fullResponse(document, selection) {
89
+ const status = selection.responseStatus ?? '200';
90
+ if (selection.body !== undefined && selection.body !== 'none')
91
+ throw new Error('UNSUPPORTED_RESPONSE_BODY_PROFILE');
92
+ if (selection.body === 'none') {
93
+ if (status !== '204')
94
+ throw new Error('EMPTY_RESPONSE_REQUIRES_204');
95
+ if (selection.responsePath?.length)
96
+ throw new Error('EMPTY_RESPONSE_PATH_NOT_SUPPORTED');
97
+ }
98
+ else if (status === '204')
99
+ throw new Error('RESPONSE_BODY_PROFILE_MISMATCH');
100
+ else if (!['200', '201', '202'].includes(status))
101
+ throw new Error('UNSUPPORTED_JSON_SUCCESS_STATUS');
102
+ for (const item of Object.values(document.paths))
103
+ for (const [method, value] of Object.entries(item)) {
104
+ if (!['get', 'post', 'put', 'patch', 'delete', 'head', 'options'].includes(method))
105
+ continue;
106
+ const operation = value;
107
+ if (operation.operationId === selection.operationId) {
108
+ const response = operation.responses?.[status];
109
+ if (selection.body === 'none') {
110
+ if (!response)
111
+ throw new Error('MISSING_EMPTY_RESPONSE');
112
+ if (Object.hasOwn(response, 'content'))
113
+ throw new Error('RESPONSE_BODY_PROFILE_MISMATCH');
114
+ return { body: 'none' };
115
+ }
116
+ const schema = response?.content?.['application/json']?.schema;
117
+ if (schema)
118
+ return { body: 'json', schema };
119
+ }
120
+ }
121
+ throw new Error(selection.body === 'none' ? 'MISSING_EMPTY_RESPONSE' : 'MISSING_JSON_RESPONSE');
122
+ }
123
+ export function readModelOutputs(document, selections) {
124
+ if (!document.openapi.startsWith('3.1.'))
125
+ throw new Error('READ_MODELS_REQUIRE_OPENAPI_3_1');
126
+ const ajv = new Ajv({ strict: true, allErrors: false, code: { source: true }, coerceTypes: false, useDefaults: false, removeAdditional: false });
127
+ addFormats(ajv);
128
+ const mapping = {}, types = [], validators = [], bodyless = [];
129
+ for (const selection of selections) {
130
+ const response = fullResponse(document, selection);
131
+ validators.push(' readonly ' + JSON.stringify(selection.name) + ': (value: unknown) => boolean;');
132
+ if (response.body === 'none') {
133
+ types.push(' ' + JSON.stringify(selection.name) + ': undefined;');
134
+ bodyless.push('exports[' + JSON.stringify(selection.name) + '] = value => value === undefined;');
135
+ continue;
136
+ }
137
+ const id = 'urn:mpfrontend:read:' + selection.name;
138
+ types.push(' ' + JSON.stringify(selection.name) + ': ' + readType(response.schema, document) + ';');
139
+ ajv.addSchema({ ...readShape(response.schema, document), $id: id });
140
+ mapping[selection.name] = id;
141
+ }
142
+ return {
143
+ 'read-models.gen.ts': selections.length ? 'import validators from "./read-validators.gen.cjs";\nexport type ReadModels = {\n' + types.join('\n') + '\n};\n' +
144
+ 'export function parseRead<K extends keyof ReadModels>(resource: K, value: unknown): ReadModels[K] {\n' +
145
+ ' if (!Object.hasOwn(validators, resource) || !validators[resource](value)) throw new Error("INVALID_API_RESPONSE");\n' +
146
+ ' return value as ReadModels[K];\n}\n' :
147
+ 'export type ReadModels = Record<never, never>;\nexport function parseRead(resource: never, value: unknown): never {\n void resource; void value; throw new Error("INVALID_API_RESPONSE");\n}\n',
148
+ 'read-validators.gen.cjs': standalone(ajv, mapping) + (bodyless.length ? '\n' + bodyless.join('\n') + '\n' : ''),
149
+ 'read-validators.gen.d.cts': validators.length ? 'declare const validators: {\n' + validators.join('\n') + '\n};\nexport = validators;\n' : 'declare const validators: Record<string, never>;\nexport = validators;\n'
150
+ };
151
+ }
152
+ function optionalJsonBranches(raw, document) {
153
+ const schema = resolved(raw, document);
154
+ if (!schema.oneOf)
155
+ return { schema, nonNull: null };
156
+ if (schema.anyOf || schema.allOf || schema.oneOf.length !== 2)
157
+ throw new Error('UNSUPPORTED_OPTIONAL_JSON_SCHEMA');
158
+ const branches = schema.oneOf.map(branch => resolved(branch, document));
159
+ const nulls = branches.filter(branch => branch.type === 'null');
160
+ if (nulls.length !== 1)
161
+ throw new Error('UNSUPPORTED_OPTIONAL_JSON_SCHEMA');
162
+ const nonNull = branches.find(branch => branch.type !== 'null');
163
+ if (!nonNull || nonNull.oneOf || nonNull.anyOf || nonNull.allOf)
164
+ throw new Error('UNSUPPORTED_OPTIONAL_JSON_SCHEMA');
165
+ return { schema, nonNull };
166
+ }
167
+ // Explicit required JSON, optional JSON or explicitly selected absent-body mutation. None grants authority.
168
+ export function requestModelOutputs(document, requests) {
169
+ if (!document.openapi.startsWith('3.1.'))
170
+ throw new Error('REQUEST_MODELS_REQUIRE_OPENAPI_3_1');
171
+ const ajv = new Ajv({ strict: true, allErrors: false, code: { source: true }, coerceTypes: false, useDefaults: false, removeAdditional: false });
172
+ addFormats(ajv);
173
+ const mapping = {}, types = [], validators = [], bodyless = [], optional = [];
174
+ for (const request of requests) {
175
+ validators.push(' readonly ' + JSON.stringify(request.name) + ': (value: unknown) => boolean;');
176
+ if (request.body === 'none') {
177
+ types.push(' ' + JSON.stringify(request.name) + ': undefined;');
178
+ bodyless.push('exports[' + JSON.stringify(request.name) + '] = value => value === undefined;');
179
+ continue;
180
+ }
181
+ const id = 'urn:mpfrontend:request:' + request.name;
182
+ if (request.body === 'optional-json') {
183
+ const { schema, nonNull } = optionalJsonBranches(request.schema, document);
184
+ const type = (nonNull ? readType(nonNull, document, 0, 'request') + ' | null' : readType(schema, document, 0, 'request')) + ' | undefined';
185
+ const shape = nonNull ? { ...schema, oneOf: [{ type: 'null' }, readShape(nonNull, document, 0, 'request')] } : readShape(schema, document, 0, 'request');
186
+ types.push(' ' + JSON.stringify(request.name) + ': ' + type + ';');
187
+ ajv.addSchema({ ...shape, $id: id });
188
+ mapping[request.name] = id;
189
+ optional.push(request.name);
190
+ continue;
191
+ }
192
+ types.push(' ' + JSON.stringify(request.name) + ': ' + readType(request.schema, document, 0, 'request') + ';');
193
+ ajv.addSchema({ ...readShape(request.schema, document, 0, 'request'), $id: id });
194
+ mapping[request.name] = id;
195
+ }
196
+ return {
197
+ 'request-models.gen.ts': requests.length ? 'import validators from "./request-validators.gen.cjs";\nexport type RequestModels = {\n' + types.join('\n') + '\n};\n' +
198
+ 'export function parseRequest<K extends keyof RequestModels>(request: K, value: unknown): RequestModels[K] {\n' +
199
+ ' if (!Object.hasOwn(validators, request) || !validators[request](value)) throw new Error("INVALID_API_REQUEST");\n' +
200
+ ' return value as RequestModels[K];\n}\n' :
201
+ 'export type RequestModels = Record<never, never>;\nexport function parseRequest(request: never, value: unknown): never {\n void request; void value; throw new Error("INVALID_API_REQUEST");\n}\n',
202
+ 'request-validators.gen.cjs': standalone(ajv, mapping) + (bodyless.length ? '\n' + bodyless.join('\n') + '\n' : '') +
203
+ (optional.length ? '\n' + optional.map((name, index) => 'const optional' + index + '=exports[' + JSON.stringify(name) + ']; exports[' + JSON.stringify(name) + '] = value => value === undefined || optional' + index + '(value);').join('\n') + '\n' : ''),
204
+ 'request-validators.gen.d.cts': validators.length ? 'declare const validators: {\n' + validators.join('\n') + '\n};\nexport = validators;\n' : 'declare const validators: Record<string, never>;\nexport = validators;\n'
205
+ };
206
+ }
207
+ //# sourceMappingURL=read-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-models.js","sourceRoot":"","sources":["../src/read-models.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
1
  {
2
2
  "name": "@mpfrontend/ftg-cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "license": "Apache-2.0",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/panahister/mpfrontend.git",
8
+ "directory": "packages/ftg-cli"
9
+ },
10
+ "type": "module",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md",
22
+ "DESIGN-SYNC.md"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public",
26
+ "provenance": true
27
+ },
28
+ "dependencies": {
29
+ "@mpfrontend/ai-skills": "0.1.0",
30
+ "@mpfrontend/ftg-core": "0.1.0",
31
+ "@mpfrontend/i18n": "0.1.0",
32
+ "@mpfrontend/nx-plugin": "0.1.0",
33
+ "@apidevtools/swagger-parser": "13.1.0",
34
+ "openapi-types": "12.1.3",
35
+ "ajv": "8.20.0",
36
+ "ajv-formats": "3.0.1",
37
+ "yaml": "2.9.1"
38
+ },
39
+ "bin": {
40
+ "ftg": "./dist/cli.js",
41
+ "mpfrontend": "./dist/cli.js"
42
+ }
6
43
  }