@jigx/sdk-tools 1.0.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/CHANGELOG.md +8 -0
- package/dist/builder/__tests__/build.test.d.ts +2 -0
- package/dist/builder/__tests__/build.test.d.ts.map +1 -0
- package/dist/builder/__tests__/build.test.js +88 -0
- package/dist/builder/__tests__/build.test.js.map +1 -0
- package/dist/builder/__tests__/extract-to-folder.test.d.ts +2 -0
- package/dist/builder/__tests__/extract-to-folder.test.d.ts.map +1 -0
- package/dist/builder/__tests__/extract-to-folder.test.js +198 -0
- package/dist/builder/__tests__/extract-to-folder.test.js.map +1 -0
- package/dist/builder/__tests__/fixtures/sample-application.d.ts +2 -0
- package/dist/builder/__tests__/fixtures/sample-application.d.ts.map +1 -0
- package/dist/builder/__tests__/fixtures/sample-application.js +56 -0
- package/dist/builder/__tests__/fixtures/sample-application.js.map +1 -0
- package/dist/builder/build.d.ts +12 -0
- package/dist/builder/build.d.ts.map +1 -0
- package/dist/builder/build.js +44 -0
- package/dist/builder/build.js.map +1 -0
- package/dist/builder/extract-to-folder.d.ts +11 -0
- package/dist/builder/extract-to-folder.d.ts.map +1 -0
- package/dist/builder/extract-to-folder.js +162 -0
- package/dist/builder/extract-to-folder.js.map +1 -0
- package/dist/builder/index.d.ts +3 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +2 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +104 -0
- package/dist/cli.js.map +1 -0
- package/dist/creator/__tests__/create.test.d.ts +2 -0
- package/dist/creator/__tests__/create.test.d.ts.map +1 -0
- package/dist/creator/__tests__/create.test.js +66 -0
- package/dist/creator/__tests__/create.test.js.map +1 -0
- package/dist/creator/create.d.ts +33 -0
- package/dist/creator/create.d.ts.map +1 -0
- package/dist/creator/create.js +65 -0
- package/dist/creator/create.js.map +1 -0
- package/dist/creator/index.d.ts +3 -0
- package/dist/creator/index.d.ts.map +1 -0
- package/dist/creator/index.js +2 -0
- package/dist/creator/index.js.map +1 -0
- package/dist/deployer/__tests__/deploy-to-strata.test.d.ts +2 -0
- package/dist/deployer/__tests__/deploy-to-strata.test.d.ts.map +1 -0
- package/dist/deployer/__tests__/deploy-to-strata.test.js +174 -0
- package/dist/deployer/__tests__/deploy-to-strata.test.js.map +1 -0
- package/dist/deployer/__tests__/deploy.test.d.ts +2 -0
- package/dist/deployer/__tests__/deploy.test.d.ts.map +1 -0
- package/dist/deployer/__tests__/deploy.test.js +116 -0
- package/dist/deployer/__tests__/deploy.test.js.map +1 -0
- package/dist/deployer/deploy-to-strata.d.ts +29 -0
- package/dist/deployer/deploy-to-strata.d.ts.map +1 -0
- package/dist/deployer/deploy-to-strata.js +161 -0
- package/dist/deployer/deploy-to-strata.js.map +1 -0
- package/dist/deployer/deploy.d.ts +7 -0
- package/dist/deployer/deploy.d.ts.map +1 -0
- package/dist/deployer/deploy.js +15 -0
- package/dist/deployer/deploy.js.map +1 -0
- package/dist/deployer/index.d.ts +5 -0
- package/dist/deployer/index.d.ts.map +1 -0
- package/dist/deployer/index.js +3 -0
- package/dist/deployer/index.js.map +1 -0
- package/dist/env-loader/__tests__/load-env.test.d.ts +2 -0
- package/dist/env-loader/__tests__/load-env.test.d.ts.map +1 -0
- package/dist/env-loader/__tests__/load-env.test.js +46 -0
- package/dist/env-loader/__tests__/load-env.test.js.map +1 -0
- package/dist/env-loader/index.d.ts +3 -0
- package/dist/env-loader/index.d.ts.map +1 -0
- package/dist/env-loader/index.js +2 -0
- package/dist/env-loader/index.js.map +1 -0
- package/dist/env-loader/load-env.d.ts +12 -0
- package/dist/env-loader/load-env.d.ts.map +1 -0
- package/dist/env-loader/load-env.js +50 -0
- package/dist/env-loader/load-env.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/prompts.d.ts +11 -0
- package/dist/prompts/prompts.d.ts.map +1 -0
- package/dist/prompts/prompts.js +45 -0
- package/dist/prompts/prompts.js.map +1 -0
- package/dist/scaffolder/__tests__/scaffold.test.d.ts +2 -0
- package/dist/scaffolder/__tests__/scaffold.test.d.ts.map +1 -0
- package/dist/scaffolder/__tests__/scaffold.test.js +112 -0
- package/dist/scaffolder/__tests__/scaffold.test.js.map +1 -0
- package/dist/scaffolder/index.d.ts +4 -0
- package/dist/scaffolder/index.d.ts.map +1 -0
- package/dist/scaffolder/index.js +2 -0
- package/dist/scaffolder/index.js.map +1 -0
- package/dist/scaffolder/scaffold.d.ts +16 -0
- package/dist/scaffolder/scaffold.d.ts.map +1 -0
- package/dist/scaffolder/scaffold.js +45 -0
- package/dist/scaffolder/scaffold.js.map +1 -0
- package/dist/scaffolder/templates.d.ts +13 -0
- package/dist/scaffolder/templates.d.ts.map +1 -0
- package/dist/scaffolder/templates.js +124 -0
- package/dist/scaffolder/templates.js.map +1 -0
- package/dist/slug/__tests__/validate.test.d.ts +2 -0
- package/dist/slug/__tests__/validate.test.d.ts.map +1 -0
- package/dist/slug/__tests__/validate.test.js +51 -0
- package/dist/slug/__tests__/validate.test.js.map +1 -0
- package/dist/slug/index.d.ts +3 -0
- package/dist/slug/index.d.ts.map +1 -0
- package/dist/slug/index.js +2 -0
- package/dist/slug/index.js.map +1 -0
- package/dist/slug/validate.d.ts +11 -0
- package/dist/slug/validate.d.ts.map +1 -0
- package/dist/slug/validate.js +29 -0
- package/dist/slug/validate.js.map +1 -0
- package/package.json +58 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.0.0 (2026-05-05)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **sdk-tools:** scaffold + build + deploy CLI for solution-designers ([#824](https://github.com/jigx-com/jigx-sdk/issues/824)) ([dcced17](https://github.com/jigx-com/jigx-sdk/commit/dcced17d8a1fd84373e687aca2ce0b850a1aeb6a))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.test.d.ts","sourceRoot":"","sources":["../../../src/builder/__tests__/build.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { mkdtemp, mkdir, readFile, readdir, rm, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, test } from 'vitest';
|
|
5
|
+
import { parse as parseYaml } from 'yaml';
|
|
6
|
+
import { build } from '../build.js';
|
|
7
|
+
import { sampleApplication } from './fixtures/sample-application.js';
|
|
8
|
+
async function createFixture(appSource) {
|
|
9
|
+
const projectRoot = await mkdtemp(path.join(tmpdir(), 'jigx-sdk-tools-test-'));
|
|
10
|
+
const srcDir = path.join(projectRoot, 'src');
|
|
11
|
+
await mkdir(srcDir, { recursive: true });
|
|
12
|
+
await writeFile(path.join(projectRoot, 'package.json'), JSON.stringify({ name: 'fixture', private: true, type: 'module' }), 'utf8');
|
|
13
|
+
await writeFile(path.join(srcDir, 'app.ts'), appSource, 'utf8');
|
|
14
|
+
return { projectRoot };
|
|
15
|
+
}
|
|
16
|
+
function appSourceFor(application) {
|
|
17
|
+
return `export const app = { build: () => (${JSON.stringify(application)}) }\n`;
|
|
18
|
+
}
|
|
19
|
+
describe('Builder.build', () => {
|
|
20
|
+
let fixture;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
fixture = undefined;
|
|
23
|
+
});
|
|
24
|
+
afterEach(async () => {
|
|
25
|
+
if (fixture) {
|
|
26
|
+
await rm(fixture.projectRoot, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
test('writes build/output.json and decomposes Application into build/app/', async () => {
|
|
30
|
+
fixture = await createFixture(appSourceFor(sampleApplication));
|
|
31
|
+
const result = await build({ projectRoot: fixture.projectRoot });
|
|
32
|
+
expect(result.outputJsonPath).toBe(path.join(fixture.projectRoot, 'build', 'output.json'));
|
|
33
|
+
expect(result.extractedFolderPath).toBe(path.join(fixture.projectRoot, 'build', 'app'));
|
|
34
|
+
const json = JSON.parse(await readFile(result.outputJsonPath, 'utf8'));
|
|
35
|
+
expect(json).toMatchObject({
|
|
36
|
+
name: 'fixture-app',
|
|
37
|
+
title: 'Fixture Application',
|
|
38
|
+
category: 'business',
|
|
39
|
+
});
|
|
40
|
+
const index = parseYaml(await readFile(path.join(result.extractedFolderPath, 'index.jigx'), 'utf8'));
|
|
41
|
+
expect(index).toEqual({
|
|
42
|
+
title: 'Fixture Application',
|
|
43
|
+
name: 'fixture-app',
|
|
44
|
+
category: 'business',
|
|
45
|
+
description: 'A fixture for tests',
|
|
46
|
+
});
|
|
47
|
+
const folders = await readdir(result.extractedFolderPath);
|
|
48
|
+
expect(folders.sort()).toEqual([
|
|
49
|
+
'actions',
|
|
50
|
+
'assets',
|
|
51
|
+
'components',
|
|
52
|
+
'databases',
|
|
53
|
+
'datasources',
|
|
54
|
+
'functions',
|
|
55
|
+
'index.jigx',
|
|
56
|
+
'jigs',
|
|
57
|
+
'scripts',
|
|
58
|
+
'translations',
|
|
59
|
+
]);
|
|
60
|
+
expect(result.filesExtracted).toBeGreaterThan(0);
|
|
61
|
+
});
|
|
62
|
+
test('does not write the legacy build/output.yaml', async () => {
|
|
63
|
+
fixture = await createFixture(appSourceFor(sampleApplication));
|
|
64
|
+
await build({ projectRoot: fixture.projectRoot });
|
|
65
|
+
await expect(stat(path.join(fixture.projectRoot, 'build', 'output.yaml'))).rejects.toThrow();
|
|
66
|
+
});
|
|
67
|
+
test('throws when src/app.ts is missing', async () => {
|
|
68
|
+
fixture = { projectRoot: await mkdtemp(path.join(tmpdir(), 'jigx-sdk-tools-test-')) };
|
|
69
|
+
await expect(build({ projectRoot: fixture.projectRoot })).rejects.toThrow(/Application source not found/);
|
|
70
|
+
});
|
|
71
|
+
test('propagates errors thrown by the Application builder', async () => {
|
|
72
|
+
fixture = await createFixture(`
|
|
73
|
+
export const app = {
|
|
74
|
+
build: () => {
|
|
75
|
+
throw new Error('builder exploded')
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
`);
|
|
79
|
+
await expect(build({ projectRoot: fixture.projectRoot })).rejects.toThrow(/builder exploded/);
|
|
80
|
+
});
|
|
81
|
+
test('throws when src/app.ts has no named export `app`', async () => {
|
|
82
|
+
fixture = await createFixture(`
|
|
83
|
+
export const notApp = { build: () => ({}) }
|
|
84
|
+
`);
|
|
85
|
+
await expect(build({ projectRoot: fixture.projectRoot })).rejects.toThrow(/named export 'app'/);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=build.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.test.js","sourceRoot":"","sources":["../../../src/builder/__tests__/build.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-to-folder.test.d.ts","sourceRoot":"","sources":["../../../src/builder/__tests__/extract-to-folder.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { mkdtemp, readFile, readdir, rm, stat } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, test } from 'vitest';
|
|
5
|
+
import { parse as parseYaml } from 'yaml';
|
|
6
|
+
import { extractToFolder } from '../extract-to-folder.js';
|
|
7
|
+
import { sampleApplication } from './fixtures/sample-application.js';
|
|
8
|
+
async function createWorkspace() {
|
|
9
|
+
const destinationDir = await mkdtemp(path.join(tmpdir(), 'jigx-sdk-tools-extract-'));
|
|
10
|
+
return { destinationDir };
|
|
11
|
+
}
|
|
12
|
+
async function listRelative(root) {
|
|
13
|
+
const out = [];
|
|
14
|
+
const walk = async (dir) => {
|
|
15
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
16
|
+
const full = path.join(dir, entry.name);
|
|
17
|
+
if (entry.isDirectory()) {
|
|
18
|
+
await walk(full);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
out.push(path.relative(root, full));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
await walk(root);
|
|
26
|
+
return out.sort();
|
|
27
|
+
}
|
|
28
|
+
describe('extractToFolder', () => {
|
|
29
|
+
let workspace;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
workspace = undefined;
|
|
32
|
+
});
|
|
33
|
+
afterEach(async () => {
|
|
34
|
+
if (workspace) {
|
|
35
|
+
await rm(workspace.destinationDir, { recursive: true, force: true });
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
test('emits canonical Builder folder layout for a realistic Application', async () => {
|
|
39
|
+
workspace = await createWorkspace();
|
|
40
|
+
const result = await extractToFolder({
|
|
41
|
+
application: sampleApplication,
|
|
42
|
+
destinationDir: workspace.destinationDir,
|
|
43
|
+
});
|
|
44
|
+
expect(await listRelative(workspace.destinationDir)).toEqual([
|
|
45
|
+
'actions/logout.jigx',
|
|
46
|
+
'assets/theme.jigx',
|
|
47
|
+
'components/greeting.jigx',
|
|
48
|
+
'databases/default.jigx',
|
|
49
|
+
'datasources/customers.jigx',
|
|
50
|
+
'functions/get-customer.jigx',
|
|
51
|
+
'index.jigx',
|
|
52
|
+
'jigs/home.jigx',
|
|
53
|
+
path.join('scripts', 'expressions', 'helper.js'),
|
|
54
|
+
'translations/en.jigx',
|
|
55
|
+
]);
|
|
56
|
+
expect(result.files.length).toBe(10);
|
|
57
|
+
});
|
|
58
|
+
test('index.jigx contains only root metadata; folder kinds are removed', async () => {
|
|
59
|
+
workspace = await createWorkspace();
|
|
60
|
+
await extractToFolder({
|
|
61
|
+
application: sampleApplication,
|
|
62
|
+
destinationDir: workspace.destinationDir,
|
|
63
|
+
});
|
|
64
|
+
const index = parseYaml(await readFile(path.join(workspace.destinationDir, 'index.jigx'), 'utf8'));
|
|
65
|
+
expect(index).toEqual({
|
|
66
|
+
title: 'Fixture Application',
|
|
67
|
+
name: 'fixture-app',
|
|
68
|
+
category: 'business',
|
|
69
|
+
description: 'A fixture for tests',
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
test('strips redundant {kind}Id from each entity body', async () => {
|
|
73
|
+
workspace = await createWorkspace();
|
|
74
|
+
await extractToFolder({
|
|
75
|
+
application: sampleApplication,
|
|
76
|
+
destinationDir: workspace.destinationDir,
|
|
77
|
+
});
|
|
78
|
+
const read = async (rel) => parseYaml(await readFile(path.join(workspace.destinationDir, rel), 'utf8'));
|
|
79
|
+
expect(await read('jigs/home.jigx')).toEqual({ title: 'Home', type: 'jig-default' });
|
|
80
|
+
expect(await read('functions/get-customer.jigx')).toEqual({
|
|
81
|
+
provider: 'rest',
|
|
82
|
+
method: 'GET',
|
|
83
|
+
url: 'https://api.example.com/customer',
|
|
84
|
+
});
|
|
85
|
+
expect(await read('actions/logout.jigx')).toEqual({ action: 'sign-out' });
|
|
86
|
+
expect(await read('components/greeting.jigx')).toEqual({ children: [] });
|
|
87
|
+
expect(await read('datasources/customers.jigx')).toEqual({
|
|
88
|
+
provider: 'sqlite',
|
|
89
|
+
entity: 'customers',
|
|
90
|
+
});
|
|
91
|
+
expect(await read('databases/default.jigx')).toEqual({ tables: {} });
|
|
92
|
+
});
|
|
93
|
+
test('wraps assets entries under their id key', async () => {
|
|
94
|
+
workspace = await createWorkspace();
|
|
95
|
+
await extractToFolder({
|
|
96
|
+
application: sampleApplication,
|
|
97
|
+
destinationDir: workspace.destinationDir,
|
|
98
|
+
});
|
|
99
|
+
const theme = parseYaml(await readFile(path.join(workspace.destinationDir, 'assets/theme.jigx'), 'utf8'));
|
|
100
|
+
expect(theme).toEqual({ theme: { palette: { primary: '#fff' } } });
|
|
101
|
+
});
|
|
102
|
+
test('writes scripts.expressions[name] as raw .js using the verbatim key', async () => {
|
|
103
|
+
workspace = await createWorkspace();
|
|
104
|
+
await extractToFolder({
|
|
105
|
+
application: sampleApplication,
|
|
106
|
+
destinationDir: workspace.destinationDir,
|
|
107
|
+
});
|
|
108
|
+
const helper = await readFile(path.join(workspace.destinationDir, 'scripts', 'expressions', 'helper.js'), 'utf8');
|
|
109
|
+
expect(helper).toBe("module.exports = () => 'hi'\n");
|
|
110
|
+
});
|
|
111
|
+
test('field ordering matches applyPropertyOrder semantics', async () => {
|
|
112
|
+
workspace = await createWorkspace();
|
|
113
|
+
await extractToFolder({
|
|
114
|
+
application: sampleApplication,
|
|
115
|
+
destinationDir: workspace.destinationDir,
|
|
116
|
+
});
|
|
117
|
+
const indexRaw = await readFile(path.join(workspace.destinationDir, 'index.jigx'), 'utf8');
|
|
118
|
+
const indexLines = indexRaw
|
|
119
|
+
.trim()
|
|
120
|
+
.split('\n')
|
|
121
|
+
.map((l) => l.split(':')[0]);
|
|
122
|
+
expect(indexLines).toEqual(['title', 'name', 'category', 'description']);
|
|
123
|
+
const fnRaw = await readFile(path.join(workspace.destinationDir, 'functions/get-customer.jigx'), 'utf8');
|
|
124
|
+
const fnLines = fnRaw
|
|
125
|
+
.trim()
|
|
126
|
+
.split('\n')
|
|
127
|
+
.map((l) => l.split(':')[0]);
|
|
128
|
+
expect(fnLines).toEqual(['provider', 'method', 'url']);
|
|
129
|
+
});
|
|
130
|
+
test('emits empty entities (default database with no tables) as their own file', async () => {
|
|
131
|
+
workspace = await createWorkspace();
|
|
132
|
+
await extractToFolder({
|
|
133
|
+
application: {
|
|
134
|
+
name: 'minimal',
|
|
135
|
+
databases: { default: { databaseId: 'default' } },
|
|
136
|
+
},
|
|
137
|
+
destinationDir: workspace.destinationDir,
|
|
138
|
+
});
|
|
139
|
+
const dbStat = await stat(path.join(workspace.destinationDir, 'databases/default.jigx'));
|
|
140
|
+
expect(dbStat.isFile()).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
test('creates all 9 canonical folders even when empty', async () => {
|
|
143
|
+
workspace = await createWorkspace();
|
|
144
|
+
await extractToFolder({
|
|
145
|
+
application: { name: 'minimal' },
|
|
146
|
+
destinationDir: workspace.destinationDir,
|
|
147
|
+
});
|
|
148
|
+
for (const kind of [
|
|
149
|
+
'databases',
|
|
150
|
+
'datasources',
|
|
151
|
+
'functions',
|
|
152
|
+
'jigs',
|
|
153
|
+
'components',
|
|
154
|
+
'translations',
|
|
155
|
+
'actions',
|
|
156
|
+
'assets',
|
|
157
|
+
'scripts',
|
|
158
|
+
]) {
|
|
159
|
+
const folderStat = await stat(path.join(workspace.destinationDir, kind));
|
|
160
|
+
expect(folderStat.isDirectory(), `${kind} folder should exist`).toBe(true);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
test('strips runtimeSchemaVersion and $private from index', async () => {
|
|
164
|
+
workspace = await createWorkspace();
|
|
165
|
+
await extractToFolder({
|
|
166
|
+
application: {
|
|
167
|
+
name: 'fx',
|
|
168
|
+
runtimeSchemaVersion: 7,
|
|
169
|
+
$private: { secret: true },
|
|
170
|
+
},
|
|
171
|
+
destinationDir: workspace.destinationDir,
|
|
172
|
+
});
|
|
173
|
+
const index = parseYaml(await readFile(path.join(workspace.destinationDir, 'index.jigx'), 'utf8'));
|
|
174
|
+
expect(index.runtimeSchemaVersion).toBeUndefined();
|
|
175
|
+
expect(index.$private).toBeUndefined();
|
|
176
|
+
expect(index.name).toBe('fx');
|
|
177
|
+
});
|
|
178
|
+
test('skips components flagged as $private.isStoreComponent', async () => {
|
|
179
|
+
workspace = await createWorkspace();
|
|
180
|
+
await extractToFolder({
|
|
181
|
+
application: {
|
|
182
|
+
name: 'fx',
|
|
183
|
+
components: {
|
|
184
|
+
local: { componentId: 'local', children: [] },
|
|
185
|
+
fromStore: {
|
|
186
|
+
componentId: 'fromStore',
|
|
187
|
+
children: [],
|
|
188
|
+
$private: { isStoreComponent: true },
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
destinationDir: workspace.destinationDir,
|
|
193
|
+
});
|
|
194
|
+
const componentFiles = await readdir(path.join(workspace.destinationDir, 'components'));
|
|
195
|
+
expect(componentFiles).toEqual(['local.jigx']);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=extract-to-folder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-to-folder.test.js","sourceRoot":"","sources":["../../../src/builder/__tests__/extract-to-folder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample-application.d.ts","sourceRoot":"","sources":["../../../../src/builder/__tests__/fixtures/sample-application.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAsDrD,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export const sampleApplication = {
|
|
2
|
+
name: 'fixture-app',
|
|
3
|
+
title: 'Fixture Application',
|
|
4
|
+
category: 'business',
|
|
5
|
+
description: 'A fixture for tests',
|
|
6
|
+
runtimeSchemaVersion: 7,
|
|
7
|
+
databases: {
|
|
8
|
+
default: { databaseId: 'default', tables: {} },
|
|
9
|
+
},
|
|
10
|
+
datasources: {
|
|
11
|
+
customers: {
|
|
12
|
+
datasourceId: 'customers',
|
|
13
|
+
provider: 'sqlite',
|
|
14
|
+
entity: 'customers',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
functions: {
|
|
18
|
+
'get-customer': {
|
|
19
|
+
functionId: 'get-customer',
|
|
20
|
+
provider: 'rest',
|
|
21
|
+
method: 'GET',
|
|
22
|
+
url: 'https://api.example.com/customer',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
jigs: {
|
|
26
|
+
home: {
|
|
27
|
+
jigId: 'home',
|
|
28
|
+
type: 'jig-default',
|
|
29
|
+
title: 'Home',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
components: {
|
|
33
|
+
greeting: {
|
|
34
|
+
componentId: 'greeting',
|
|
35
|
+
children: [],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
actions: {
|
|
39
|
+
logout: {
|
|
40
|
+
actionId: 'logout',
|
|
41
|
+
action: 'sign-out',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
translations: {
|
|
45
|
+
en: { hello: 'Hi' },
|
|
46
|
+
},
|
|
47
|
+
assets: {
|
|
48
|
+
theme: { palette: { primary: '#fff' } },
|
|
49
|
+
},
|
|
50
|
+
scripts: {
|
|
51
|
+
expressions: {
|
|
52
|
+
'helper.js': "module.exports = () => 'hi'\n",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=sample-application.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample-application.js","sourceRoot":"","sources":["../../../../src/builder/__tests__/fixtures/sample-application.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAA4B;IACxD,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,qBAAqB;IAClC,oBAAoB,EAAE,CAAC;IACvB,SAAS,EAAE;QACT,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;KAC/C;IACD,WAAW,EAAE;QACX,SAAS,EAAE;YACT,YAAY,EAAE,WAAW;YACzB,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW;SACpB;KACF;IACD,SAAS,EAAE;QACT,cAAc,EAAE;YACd,UAAU,EAAE,cAAc;YAC1B,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,kCAAkC;SACxC;KACF;IACD,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,MAAM;SACd;KACF;IACD,UAAU,EAAE;QACV,QAAQ,EAAE;YACR,WAAW,EAAE,UAAU;YACvB,QAAQ,EAAE,EAAE;SACb;KACF;IACD,OAAO,EAAE;QACP,MAAM,EAAE;YACN,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,UAAU;SACnB;KACF;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;KACpB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;KACxC;IACD,OAAO,EAAE;QACP,WAAW,EAAE;YACX,WAAW,EAAE,+BAA+B;SAC7C;KACF;CACF,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface BuildOptions {
|
|
2
|
+
readonly projectRoot: string;
|
|
3
|
+
}
|
|
4
|
+
export interface BuildResult {
|
|
5
|
+
readonly outputJsonPath: string;
|
|
6
|
+
readonly extractedFolderPath: string;
|
|
7
|
+
readonly filesExtracted: number;
|
|
8
|
+
readonly outputSizeBytes: number;
|
|
9
|
+
readonly buildTimeMs: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function build(options: BuildOptions): Promise<BuildResult>;
|
|
12
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/builder/build.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAE3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAaD,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAiDvE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { access, mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { tsImport } from 'tsx/esm/api';
|
|
5
|
+
import { extractToFolder, isPlainObject } from './extract-to-folder.js';
|
|
6
|
+
export async function build(options) {
|
|
7
|
+
const { projectRoot } = options;
|
|
8
|
+
const startTime = Date.now();
|
|
9
|
+
const appTsPath = path.resolve(projectRoot, 'src', 'app.ts');
|
|
10
|
+
try {
|
|
11
|
+
await access(appTsPath);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
throw new Error(`Application source not found at ${appTsPath}. Expected src/app.ts with named export 'app' (an ApplicationBuilder).`);
|
|
15
|
+
}
|
|
16
|
+
const appModule = (await tsImport(pathToFileURL(appTsPath).href, import.meta.url));
|
|
17
|
+
const exported = appModule.app;
|
|
18
|
+
if (!exported || typeof exported.build !== 'function') {
|
|
19
|
+
throw new Error(`Application source ${appTsPath} must provide a named export 'app' with a .build() method (an ApplicationBuilder instance).`);
|
|
20
|
+
}
|
|
21
|
+
const builtResult = exported.build();
|
|
22
|
+
if (!isPlainObject(builtResult)) {
|
|
23
|
+
throw new Error(`app.build() must return a plain object, got ${Array.isArray(builtResult) ? 'array' : typeof builtResult}`);
|
|
24
|
+
}
|
|
25
|
+
const built = builtResult;
|
|
26
|
+
const buildDir = path.join(projectRoot, 'build');
|
|
27
|
+
await mkdir(buildDir, { recursive: true });
|
|
28
|
+
const outputJsonPath = path.join(buildDir, 'output.json');
|
|
29
|
+
const outputJson = JSON.stringify(built, null, 2);
|
|
30
|
+
await writeFile(outputJsonPath, outputJson, 'utf8');
|
|
31
|
+
const extractedFolderPath = path.join(buildDir, 'app');
|
|
32
|
+
const extractResult = await extractToFolder({
|
|
33
|
+
application: built,
|
|
34
|
+
destinationDir: extractedFolderPath,
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
outputJsonPath,
|
|
38
|
+
extractedFolderPath,
|
|
39
|
+
filesExtracted: extractResult.files.length,
|
|
40
|
+
outputSizeBytes: Buffer.byteLength(outputJson, 'utf8'),
|
|
41
|
+
buildTimeMs: Date.now() - startTime,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/builder/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA0BvE,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAqB,EAAwB;IACvE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IAE5D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,mCAAmC,SAAS,wEAAwE,CACrH,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAc,CAAA;IAC/F,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAA;IAC9B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,sBAAsB,SAAS,6FAA6F,CAC7H,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAA;IACpC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,+CAA+C,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,WAAW,EAAE,CAC3G,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAA;IAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACjD,MAAM,SAAS,CAAC,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;IAEnD,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IACtD,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC;QAC1C,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,mBAAmB;KACpC,CAAC,CAAA;IAEF,OAAO;QACL,cAAc;QACd,mBAAmB;QACnB,cAAc,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM;QAC1C,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC;QACtD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACpC,CAAA;AAAA,CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface ExtractToFolderOptions {
|
|
2
|
+
readonly application: Record<string, unknown>;
|
|
3
|
+
readonly destinationDir: string;
|
|
4
|
+
}
|
|
5
|
+
interface ExtractToFolderResult {
|
|
6
|
+
readonly files: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
9
|
+
export declare function extractToFolder(options: ExtractToFolderOptions): Promise<ExtractToFolderResult>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=extract-to-folder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-to-folder.d.ts","sourceRoot":"","sources":["../../src/builder/extract-to-folder.ts"],"names":[],"mappings":"AA8FA,UAAU,sBAAsB;IAE9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE7C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,UAAU,qBAAqB;IAE7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E;AAmCD,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA0EhC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { stringify as stringifyYaml } from 'yaml';
|
|
4
|
+
const FOLDER_KINDS = [
|
|
5
|
+
'databases',
|
|
6
|
+
'datasources',
|
|
7
|
+
'functions',
|
|
8
|
+
'jigs',
|
|
9
|
+
'components',
|
|
10
|
+
'translations',
|
|
11
|
+
'actions',
|
|
12
|
+
'assets',
|
|
13
|
+
'scripts',
|
|
14
|
+
];
|
|
15
|
+
const ROOT_FIELD_ORDER = [
|
|
16
|
+
'title',
|
|
17
|
+
'name',
|
|
18
|
+
'category',
|
|
19
|
+
'description',
|
|
20
|
+
'widgets',
|
|
21
|
+
'stories',
|
|
22
|
+
];
|
|
23
|
+
const FIELD_ORDER_BY_KIND = {
|
|
24
|
+
index: ROOT_FIELD_ORDER,
|
|
25
|
+
jigs: [
|
|
26
|
+
'title',
|
|
27
|
+
'jigId',
|
|
28
|
+
'type',
|
|
29
|
+
'icon',
|
|
30
|
+
'description',
|
|
31
|
+
'provider',
|
|
32
|
+
'entity',
|
|
33
|
+
'method',
|
|
34
|
+
'actions',
|
|
35
|
+
'datasources',
|
|
36
|
+
'data',
|
|
37
|
+
'children',
|
|
38
|
+
'item',
|
|
39
|
+
'views',
|
|
40
|
+
],
|
|
41
|
+
functions: [
|
|
42
|
+
'functionId',
|
|
43
|
+
'provider',
|
|
44
|
+
'method',
|
|
45
|
+
'url',
|
|
46
|
+
'connection',
|
|
47
|
+
'procedure',
|
|
48
|
+
'query',
|
|
49
|
+
'parameters',
|
|
50
|
+
'inputTransform',
|
|
51
|
+
'outputTransform',
|
|
52
|
+
],
|
|
53
|
+
databases: ['databaseId', 'tables'],
|
|
54
|
+
components: ['children'],
|
|
55
|
+
actions: ['actionId', 'action', 'parameters'],
|
|
56
|
+
scripts: [],
|
|
57
|
+
options: [
|
|
58
|
+
'title',
|
|
59
|
+
'subtitle',
|
|
60
|
+
'dependsOn',
|
|
61
|
+
'provider',
|
|
62
|
+
'entities',
|
|
63
|
+
'entity',
|
|
64
|
+
'query',
|
|
65
|
+
'parameters',
|
|
66
|
+
'isDocument',
|
|
67
|
+
'jsonProperties',
|
|
68
|
+
],
|
|
69
|
+
'': [],
|
|
70
|
+
};
|
|
71
|
+
const ID_FIELD_BY_KIND = {
|
|
72
|
+
databases: 'databaseId',
|
|
73
|
+
datasources: 'datasourceId',
|
|
74
|
+
functions: 'functionId',
|
|
75
|
+
jigs: 'jigId',
|
|
76
|
+
components: 'componentId',
|
|
77
|
+
actions: 'actionId',
|
|
78
|
+
};
|
|
79
|
+
export function isPlainObject(value) {
|
|
80
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
81
|
+
}
|
|
82
|
+
function applyPropertyOrder(value, ordering) {
|
|
83
|
+
if (typeof value !== 'object' || value === null)
|
|
84
|
+
return value;
|
|
85
|
+
if (Array.isArray(value))
|
|
86
|
+
return value.map((item) => applyPropertyOrder(item, ''));
|
|
87
|
+
const out = {};
|
|
88
|
+
const map = new Map(Object.entries(value));
|
|
89
|
+
for (const key of FIELD_ORDER_BY_KIND[ordering] ?? []) {
|
|
90
|
+
if (map.has(key)) {
|
|
91
|
+
out[key] = applyPropertyOrder(map.get(key), key);
|
|
92
|
+
map.delete(key);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const key of [...map.keys()].sort()) {
|
|
96
|
+
out[key] = applyPropertyOrder(map.get(key), key);
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
export async function extractToFolder(options) {
|
|
101
|
+
const { application, destinationDir } = options;
|
|
102
|
+
await mkdir(destinationDir, { recursive: true });
|
|
103
|
+
const files = [];
|
|
104
|
+
const indexContent = { ...application };
|
|
105
|
+
for (const folderKind of FOLDER_KINDS) {
|
|
106
|
+
const subFolderPath = path.join(destinationDir, folderKind);
|
|
107
|
+
await mkdir(subFolderPath, { recursive: true });
|
|
108
|
+
const subContents = indexContent[folderKind];
|
|
109
|
+
if (folderKind === 'scripts') {
|
|
110
|
+
if (isPlainObject(subContents) && isPlainObject(subContents.expressions)) {
|
|
111
|
+
const expressionsDir = path.join(subFolderPath, 'expressions');
|
|
112
|
+
await mkdir(expressionsDir, { recursive: true });
|
|
113
|
+
for (const [name, body] of Object.entries(subContents.expressions)) {
|
|
114
|
+
const filePath = path.join(expressionsDir, name);
|
|
115
|
+
await writeFile(filePath, String(body), 'utf8');
|
|
116
|
+
files.push(filePath);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
Reflect.deleteProperty(indexContent, folderKind);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (isPlainObject(subContents)) {
|
|
123
|
+
for (const [id, rawValue] of Object.entries(subContents)) {
|
|
124
|
+
if (rawValue === null || rawValue === undefined)
|
|
125
|
+
continue;
|
|
126
|
+
let value = rawValue;
|
|
127
|
+
if (folderKind === 'components' && isPlainObject(value)) {
|
|
128
|
+
const priv = value.$private;
|
|
129
|
+
if (isPlainObject(priv) && priv.isStoreComponent === true)
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (isPlainObject(value)) {
|
|
133
|
+
const stripped = { ...value };
|
|
134
|
+
delete stripped.$private;
|
|
135
|
+
value = stripped;
|
|
136
|
+
}
|
|
137
|
+
const idField = ID_FIELD_BY_KIND[folderKind];
|
|
138
|
+
if (idField && isPlainObject(value)) {
|
|
139
|
+
const mut = { ...value };
|
|
140
|
+
if (mut[idField] === id)
|
|
141
|
+
Reflect.deleteProperty(mut, idField);
|
|
142
|
+
value = mut;
|
|
143
|
+
}
|
|
144
|
+
else if (folderKind === 'assets') {
|
|
145
|
+
value = { [id]: value };
|
|
146
|
+
}
|
|
147
|
+
const ordered = applyPropertyOrder(value, folderKind);
|
|
148
|
+
const filePath = path.join(subFolderPath, `${id}.jigx`);
|
|
149
|
+
await writeFile(filePath, stringifyYaml(ordered), 'utf8');
|
|
150
|
+
files.push(filePath);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
Reflect.deleteProperty(indexContent, folderKind);
|
|
154
|
+
}
|
|
155
|
+
delete indexContent.$private;
|
|
156
|
+
delete indexContent.runtimeSchemaVersion;
|
|
157
|
+
const indexPath = path.join(destinationDir, 'index.jigx');
|
|
158
|
+
await writeFile(indexPath, stringifyYaml(applyPropertyOrder(indexContent, 'index')), 'utf8');
|
|
159
|
+
files.push(indexPath);
|
|
160
|
+
return { files };
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=extract-to-folder.js.map
|