@origostudio/cli 0.0.25
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 +116 -0
- package/README.md +11 -0
- package/package.json +20 -0
- package/package.json.bak +20 -0
- package/src/commands/generate/entity.d.ts +2 -0
- package/src/commands/generate/entity.js +24 -0
- package/src/commands/generate/entity.js.map +1 -0
- package/src/commands/generate/index.d.ts +2 -0
- package/src/commands/generate/index.js +30 -0
- package/src/commands/generate/index.js.map +1 -0
- package/src/commands/init.d.ts +5 -0
- package/src/commands/init.js +27 -0
- package/src/commands/init.js.map +1 -0
- package/src/commands/new.d.ts +2 -0
- package/src/commands/new.js +24 -0
- package/src/commands/new.js.map +1 -0
- package/src/commands/validate.d.ts +2 -0
- package/src/commands/validate.js +50 -0
- package/src/commands/validate.js.map +1 -0
- package/src/index.d.ts +11 -0
- package/src/index.js +15 -0
- package/src/index.js.map +1 -0
- package/src/lib/cli.d.ts +1 -0
- package/src/lib/cli.js +7 -0
- package/src/lib/cli.js.map +1 -0
- package/src/lib/generator.d.ts +16 -0
- package/src/lib/generator.js +165 -0
- package/src/lib/generator.js.map +1 -0
- package/src/lib/scaffolding.d.ts +5 -0
- package/src/lib/scaffolding.js +87 -0
- package/src/lib/scaffolding.js.map +1 -0
- package/src/lib/validation.d.ts +4 -0
- package/src/lib/validation.js +191 -0
- package/src/lib/validation.js.map +1 -0
- package/src/main.d.ts +4 -0
- package/src/main.js +38 -0
- package/src/main.js.map +1 -0
- package/src/templates/entity.json +6 -0
- package/src/templates/extension.json +8 -0
- package/src/templates/index.d.ts +29 -0
- package/src/templates/index.js +61 -0
- package/src/templates/index.js.map +1 -0
- package/src/templates/origo.json +16 -0
- package/src/utils/errors.d.ts +15 -0
- package/src/utils/errors.js +58 -0
- package/src/utils/errors.js.map +1 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
## 0.0.25 (2026-09-07)
|
|
2
|
+
|
|
3
|
+
### 🚀 Features
|
|
4
|
+
|
|
5
|
+
- initialize package.json files for cli, core, design-tokens, playground, and angular-renderer packages ([2dee8cc](https://github.com/OrigoStudio/origo-design/commit/2dee8cc))
|
|
6
|
+
|
|
7
|
+
### ❤️ Thank You
|
|
8
|
+
|
|
9
|
+
- Hardik Patel @hardikpatelse
|
|
10
|
+
|
|
11
|
+
## 0.0.24 (2026-09-07)
|
|
12
|
+
|
|
13
|
+
This was a version bump only for cli to align it with other projects, there were no code changes.
|
|
14
|
+
|
|
15
|
+
## 0.0.23 (2026-09-07)
|
|
16
|
+
|
|
17
|
+
### 🚀 Features
|
|
18
|
+
|
|
19
|
+
- add CLI package and configure automated Nx release pipeline ([6ec80c7](https://github.com/OrigoStudio/origo-design/commit/6ec80c7))
|
|
20
|
+
|
|
21
|
+
### ❤️ Thank You
|
|
22
|
+
|
|
23
|
+
- Hardik Patel @hardikpatelse
|
|
24
|
+
|
|
25
|
+
## 0.0.22 (2026-09-04)
|
|
26
|
+
|
|
27
|
+
### 🚀 Features
|
|
28
|
+
|
|
29
|
+
- scaffold playground application and e2e testing suite with initial editor component and schema registry ([f097894](https://github.com/OrigoStudio/origo-design/commit/f097894))
|
|
30
|
+
- add GitHub Actions workflow to automate library releases using Nx Release ([3d6651f](https://github.com/OrigoStudio/origo-design/commit/3d6651f))
|
|
31
|
+
|
|
32
|
+
### ❤️ Thank You
|
|
33
|
+
|
|
34
|
+
- Hardik Patel @hardikpatelse
|
|
35
|
+
|
|
36
|
+
## 0.0.21 (2026-09-02)
|
|
37
|
+
|
|
38
|
+
### 🚀 Features
|
|
39
|
+
|
|
40
|
+
- add centralized test registry tool with validation logic, CI integration, and documentation artifacts ([384c1c7](https://github.com/OrigoStudio/origo-design/commit/384c1c7))
|
|
41
|
+
- implement central test registry with validation tools and CI integration ([02cf656](https://github.com/OrigoStudio/origo-design/commit/02cf656))
|
|
42
|
+
- initialize negative testing story and update sprint status tracking ([bbe5fdc](https://github.com/OrigoStudio/origo-design/commit/bbe5fdc))
|
|
43
|
+
- implement CLI framework with validation, testing, and CI/CD workflows ([ff6ce55](https://github.com/OrigoStudio/origo-design/commit/ff6ce55))
|
|
44
|
+
- implement validate command and schema validation logic for BADL files ([4f9e41d](https://github.com/OrigoStudio/origo-design/commit/4f9e41d))
|
|
45
|
+
- implement path traversal guards, remove process termination from library logic, and enable error cause preservation in @origo/cli ([0854f78](https://github.com/OrigoStudio/origo-design/commit/0854f78))
|
|
46
|
+
- initialize web-based editor component and track security remediation tasks in implementation artifacts ([65716bd](https://github.com/OrigoStudio/origo-design/commit/65716bd))
|
|
47
|
+
- document e2e npm verification plan for cli package releases ([22dab4c](https://github.com/OrigoStudio/origo-design/commit/22dab4c))
|
|
48
|
+
- initialize sprint status tracking and retrospective verification story for npm packaging ([c326751](https://github.com/OrigoStudio/origo-design/commit/c326751))
|
|
49
|
+
- add generated bundle for epic7-worker-csp spike ([16ca492](https://github.com/OrigoStudio/origo-design/commit/16ca492))
|
|
50
|
+
- add web worker CSP spike and associated implementation documentation ([ebf5aa4](https://github.com/OrigoStudio/origo-design/commit/ebf5aa4))
|
|
51
|
+
- implement web worker CSP spike with supporting documentation and harness tools ([f57b1e5](https://github.com/OrigoStudio/origo-design/commit/f57b1e5))
|
|
52
|
+
- add technical spike story for Epic 7 web worker CSP validation and ADR planning ([c977487](https://github.com/OrigoStudio/origo-design/commit/c977487))
|
|
53
|
+
- initialize sprint status tracking and create Epic 7 discovery research story ([b37b967](https://github.com/OrigoStudio/origo-design/commit/b37b967))
|
|
54
|
+
- implement entity generator command with template customization and ejection support ([02a3193](https://github.com/OrigoStudio/origo-design/commit/02a3193))
|
|
55
|
+
- implement entity generator command and template ejection logic in CLI ([d7d519a](https://github.com/OrigoStudio/origo-design/commit/d7d519a))
|
|
56
|
+
- implementation of 6-2-local-schema-validation ([45e67f6](https://github.com/OrigoStudio/origo-design/commit/45e67f6))
|
|
57
|
+
|
|
58
|
+
### ❤️ Thank You
|
|
59
|
+
|
|
60
|
+
- Hardik Patel @hardikpatelse
|
|
61
|
+
|
|
62
|
+
## 0.0.20 (2026-08-25)
|
|
63
|
+
|
|
64
|
+
### 🚀 Features
|
|
65
|
+
|
|
66
|
+
- implementation of 6-1-cli-initialization-and-scaffolding ([f6aca9e](https://github.com/OrigoStudio/origo-design/commit/f6aca9e))
|
|
67
|
+
|
|
68
|
+
### ❤️ Thank You
|
|
69
|
+
|
|
70
|
+
- Hardik Patel @hardikpatelse
|
|
71
|
+
|
|
72
|
+
## 0.0.19 (2026-08-23)
|
|
73
|
+
|
|
74
|
+
### 🚀 Features
|
|
75
|
+
|
|
76
|
+
- 5.5-5-define-secure-by-default-boilerplate-templates ([0eb6dde](https://github.com/OrigoStudio/origo-design/commit/0eb6dde))
|
|
77
|
+
|
|
78
|
+
### ❤️ Thank You
|
|
79
|
+
|
|
80
|
+
- Hardik Patel @hardikpatelse
|
|
81
|
+
|
|
82
|
+
## 0.0.18 (2026-08-23)
|
|
83
|
+
|
|
84
|
+
### 🚀 Features
|
|
85
|
+
|
|
86
|
+
- 5.5-4-verify-core-compiler-source-map-preservation ([a3b0d9b](https://github.com/OrigoStudio/origo-design/commit/a3b0d9b))
|
|
87
|
+
|
|
88
|
+
### 🩹 Fixes
|
|
89
|
+
|
|
90
|
+
- pipeline issue ([c1bbe47](https://github.com/OrigoStudio/origo-design/commit/c1bbe47))
|
|
91
|
+
|
|
92
|
+
### ❤️ Thank You
|
|
93
|
+
|
|
94
|
+
- Hardik Patel @hardikpatelse
|
|
95
|
+
|
|
96
|
+
## 0.0.17 (2026-08-21)
|
|
97
|
+
|
|
98
|
+
### 🚀 Features
|
|
99
|
+
|
|
100
|
+
- 5.5-3-resolve-recursive-schema-resolution-tech-debt ([943e2e7](https://github.com/OrigoStudio/origo-design/commit/943e2e7))
|
|
101
|
+
- 5.5-2-establish-end-to-end-qa-protocols ([d8990ae](https://github.com/OrigoStudio/origo-design/commit/d8990ae))
|
|
102
|
+
- 5.5-2-establish-end-to-end-qa-protocols ([a31d97a](https://github.com/OrigoStudio/origo-design/commit/a31d97a))
|
|
103
|
+
|
|
104
|
+
### ❤️ Thank You
|
|
105
|
+
|
|
106
|
+
- Hardik Patel @hardikpatelse
|
|
107
|
+
|
|
108
|
+
## 0.0.16 (2026-08-21)
|
|
109
|
+
|
|
110
|
+
### 🚀 Features
|
|
111
|
+
|
|
112
|
+
- 5.5-1-create-usability-quickstart-guide ([e740a1a](https://github.com/OrigoStudio/origo-design/commit/e740a1a))
|
|
113
|
+
|
|
114
|
+
### ❤️ Thank You
|
|
115
|
+
|
|
116
|
+
- Hardik Patel @hardikpatelse
|
package/README.md
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@origostudio/cli",
|
|
3
|
+
"version": "0.0.25",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"main": "./src/index.js",
|
|
7
|
+
"types": "./src/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"origo": "./src/main.js"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@origo/core": "0.0.25",
|
|
13
|
+
"commander": "^15.0.0",
|
|
14
|
+
"tslib": "^2.3.0"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/OrigoStudio/origo-design.git"
|
|
19
|
+
}
|
|
20
|
+
}
|
package/package.json.bak
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@origostudio/cli",
|
|
3
|
+
"version": "0.0.25",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"main": "./src/index.js",
|
|
7
|
+
"types": "./src/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"origo": "./src/main.js"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@origo/core": "0.0.25",
|
|
13
|
+
"commander": "^15.0.0",
|
|
14
|
+
"tslib": "^2.3.0"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/OrigoStudio/origo-design.git"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.entityCommand = entityCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const generator_1 = require("../../lib/generator");
|
|
6
|
+
const errors_1 = require("../../utils/errors");
|
|
7
|
+
function entityCommand() {
|
|
8
|
+
const cmd = new commander_1.Command('entity');
|
|
9
|
+
cmd
|
|
10
|
+
.description('Generate a new entity BADL schema')
|
|
11
|
+
.argument('<name>', 'Entity name (PascalCase, e.g. User)')
|
|
12
|
+
.option('--force', 'Overwrite existing file if it exists')
|
|
13
|
+
.option('--json', 'Output machine-readable JSON format')
|
|
14
|
+
.action(async (name, options) => {
|
|
15
|
+
try {
|
|
16
|
+
await (0, generator_1.generateEntity)(name, { force: options.force, json: options.json });
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
(0, errors_1.handleError)(error, { json: options.json });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
return cmd;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/commands/generate/entity.ts"],"names":[],"mappings":";;AAIA,sCAeC;AAnBD,yCAAoC;AACpC,mDAAqD;AACrD,+CAAiD;AAEjD,SAAgB,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,GAAG;SACA,WAAW,CAAC,mCAAmC,CAAC;SAChD,QAAQ,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACzD,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;SACzD,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA4C,EAAE,EAAE;QAC3E,IAAI,CAAC;YACH,MAAM,IAAA,0BAAc,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IACL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateCommand = generateCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const entity_1 = require("./entity");
|
|
6
|
+
const generator_1 = require("../../lib/generator");
|
|
7
|
+
const errors_1 = require("../../utils/errors");
|
|
8
|
+
function generateCommand() {
|
|
9
|
+
const cmd = new commander_1.Command('generate').description('Generate Origo artifacts');
|
|
10
|
+
cmd.addCommand((0, entity_1.entityCommand)());
|
|
11
|
+
cmd
|
|
12
|
+
.option('--eject', 'Copy internal templates to .origo/templates/ for customization')
|
|
13
|
+
.option('--force', 'Overwrite existing templates if they exist')
|
|
14
|
+
.option('--json', 'Output machine-readable JSON format')
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
if (options.eject) {
|
|
17
|
+
try {
|
|
18
|
+
await (0, generator_1.ejectTemplates)({ force: options.force, json: options.json });
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
(0, errors_1.handleError)(error, { json: options.json });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
cmd.outputHelp();
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return cmd;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/cli/src/commands/generate/index.ts"],"names":[],"mappings":";;AAKA,0CAsBC;AA3BD,yCAAoC;AACpC,qCAAyC;AACzC,mDAAqD;AACrD,+CAAiD;AAEjD,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE5E,GAAG,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;IAEhC,GAAG;SACA,MAAM,CAAC,SAAS,EAAE,gEAAgE,CAAC;SACnF,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC;SAC/D,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAA6D,EAAE,EAAE;QAC9E,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAA,0BAAc,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initCommand = initCommand;
|
|
4
|
+
exports.initializeProject = initializeProject;
|
|
5
|
+
const commander_1 = require("commander");
|
|
6
|
+
const scaffolding_1 = require("../lib/scaffolding");
|
|
7
|
+
const errors_1 = require("../utils/errors");
|
|
8
|
+
function initCommand() {
|
|
9
|
+
const init = new commander_1.Command('init')
|
|
10
|
+
.description('Initialize a new Origo project (alias for origo new)')
|
|
11
|
+
.argument('<project-name>', 'Name of the project to initialize')
|
|
12
|
+
.option('--json', 'Output machine-readable JSON format')
|
|
13
|
+
.action(async (projectName, options) => {
|
|
14
|
+
try {
|
|
15
|
+
await initializeProject(projectName, process.cwd(), options);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
(0, errors_1.handleError)(error, { json: options.json });
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
return init;
|
|
22
|
+
}
|
|
23
|
+
async function initializeProject(projectName, targetPath = process.cwd(), options = {}) {
|
|
24
|
+
// Delegate directly to scaffoldProject to maintain single source of truth for scaffolding
|
|
25
|
+
await (0, scaffolding_1.scaffoldProject)(projectName, { ...options, cwd: targetPath });
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../packages/cli/src/commands/init.ts"],"names":[],"mappings":";;AAIA,kCAcC;AAED,8CAOC;AA3BD,yCAAoC;AACpC,oDAAqD;AACrD,4CAA8C;AAE9C,SAAgB,WAAW;IACzB,MAAM,IAAI,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;SAC7B,WAAW,CAAC,sDAAsD,CAAC;SACnE,QAAQ,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;SAC/D,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAA2B,EAAE,EAAE;QACjE,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,aAAqB,OAAO,CAAC,GAAG,EAAE,EAClC,UAA8B,EAAE;IAEhC,0FAA0F;IAC1F,MAAM,IAAA,6BAAe,EAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.newCommand = newCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const scaffolding_1 = require("../lib/scaffolding");
|
|
6
|
+
const errors_1 = require("../utils/errors");
|
|
7
|
+
function newCommand() {
|
|
8
|
+
const cmd = new commander_1.Command('new');
|
|
9
|
+
cmd
|
|
10
|
+
.description('Scaffold a new Origo project')
|
|
11
|
+
.argument('<project-name>', 'Name of the project to scaffold')
|
|
12
|
+
.option('--json', 'Output machine-readable JSON format')
|
|
13
|
+
.action(async (projectName, options) => {
|
|
14
|
+
try {
|
|
15
|
+
await (0, scaffolding_1.scaffoldProject)(projectName, { json: options.json });
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
(0, errors_1.handleError)(error, { json: options.json });
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
return cmd;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../../../../packages/cli/src/commands/new.ts"],"names":[],"mappings":";;AAIA,gCAiBC;AArBD,yCAAoC;AACpC,oDAAqD;AACrD,4CAA8C;AAE9C,SAAgB,UAAU;IACxB,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,KAAK,CAAC,CAAC;IAE/B,GAAG;SACA,WAAW,CAAC,8BAA8B,CAAC;SAC3C,QAAQ,CAAC,gBAAgB,EAAE,iCAAiC,CAAC;SAC7D,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAA2B,EAAE,EAAE;QACjE,IAAI,CAAC;YACH,MAAM,IAAA,6BAAe,EAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateCommand = validateCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const validation_1 = require("../lib/validation");
|
|
6
|
+
const errors_1 = require("../utils/errors");
|
|
7
|
+
function validateCommand() {
|
|
8
|
+
const cmd = new commander_1.Command('validate');
|
|
9
|
+
cmd
|
|
10
|
+
.description('Validate BADL schemas in a directory or file')
|
|
11
|
+
.argument('[directory]', 'Directory or file containing BADL schemas to validate', './schemas')
|
|
12
|
+
.option('--json', 'Output machine-readable JSON format')
|
|
13
|
+
.action(async (directory, options) => {
|
|
14
|
+
try {
|
|
15
|
+
const totalErrors = await (0, validation_1.validateDirectory)(directory, { json: options.json });
|
|
16
|
+
if (totalErrors > 0) {
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (options.json) {
|
|
22
|
+
const code = error instanceof errors_1.CliError ? error.code : 'UNKNOWN_ERROR';
|
|
23
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
24
|
+
const jsonOutput = {
|
|
25
|
+
status: 'error',
|
|
26
|
+
data: {
|
|
27
|
+
directory,
|
|
28
|
+
filesValidated: 0,
|
|
29
|
+
errorsFound: 1,
|
|
30
|
+
results: [
|
|
31
|
+
{
|
|
32
|
+
file: directory,
|
|
33
|
+
valid: false,
|
|
34
|
+
errors: [{ code, message }],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
(0, errors_1.handleError)(error, { json: false });
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return cmd;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../../packages/cli/src/commands/validate.ts"],"names":[],"mappings":";;AAIA,0CA0CC;AA9CD,yCAAoC;AACpC,kDAAsD;AACtD,4CAAwD;AAExD,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC;IAEpC,GAAG;SACA,WAAW,CAAC,8CAA8C,CAAC;SAC3D,QAAQ,CAAC,aAAa,EAAE,uDAAuD,EAAE,WAAW,CAAC;SAC7F,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAA2B,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAA,8BAAiB,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/E,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,KAAK,YAAY,iBAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;gBACtE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,UAAU,GAAG;oBACjB,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE;wBACJ,SAAS;wBACT,cAAc,EAAE,CAAC;wBACjB,WAAW,EAAE,CAAC;wBACd,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,SAAS;gCACf,KAAK,EAAE,KAAK;gCACZ,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;6BAC5B;yBACF;qBACF;iBACF,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './main';
|
|
2
|
+
export * from './commands/new';
|
|
3
|
+
export * from './commands/init';
|
|
4
|
+
export * from './commands/validate';
|
|
5
|
+
export * from './commands/generate';
|
|
6
|
+
export * from './commands/generate/entity';
|
|
7
|
+
export * from './lib/scaffolding';
|
|
8
|
+
export * from './lib/validation';
|
|
9
|
+
export * from './lib/generator';
|
|
10
|
+
export * from './templates';
|
|
11
|
+
export * from './utils/errors';
|
package/src/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./main"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./commands/new"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./commands/init"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./commands/validate"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./commands/generate"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./commands/generate/entity"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./lib/scaffolding"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./lib/validation"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./lib/generator"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./templates"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./utils/errors"), exports);
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/cli/src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAuB;AACvB,yDAA+B;AAC/B,0DAAgC;AAChC,8DAAoC;AACpC,8DAAoC;AACpC,qEAA2C;AAC3C,4DAAkC;AAClC,2DAAiC;AACjC,0DAAgC;AAChC,sDAA4B;AAC5B,yDAA+B"}
|
package/src/lib/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cli(): string;
|
package/src/lib/cli.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../../packages/cli/src/lib/cli.ts"],"names":[],"mappings":";;AAAA,kBAEC;AAFD,SAAgB,GAAG;IACjB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface GeneratorPlugin {
|
|
2
|
+
resolveTemplate?(entityName: string): Promise<string | null>;
|
|
3
|
+
postGenerate?(context: {
|
|
4
|
+
name: string;
|
|
5
|
+
targetPath: string;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function registerGeneratorPlugin(plugin: GeneratorPlugin): void;
|
|
9
|
+
export declare function generateEntity(name: string, options: {
|
|
10
|
+
force?: boolean;
|
|
11
|
+
json?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
export declare function ejectTemplates(options: {
|
|
14
|
+
force?: boolean;
|
|
15
|
+
json?: boolean;
|
|
16
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerGeneratorPlugin = registerGeneratorPlugin;
|
|
4
|
+
exports.generateEntity = generateEntity;
|
|
5
|
+
exports.ejectTemplates = ejectTemplates;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const fs = tslib_1.__importStar(require("fs/promises"));
|
|
8
|
+
const path = tslib_1.__importStar(require("path"));
|
|
9
|
+
const errors_1 = require("../utils/errors");
|
|
10
|
+
const templates_1 = require("../templates");
|
|
11
|
+
const plugins = [];
|
|
12
|
+
function registerGeneratorPlugin(plugin) {
|
|
13
|
+
plugins.push(plugin);
|
|
14
|
+
}
|
|
15
|
+
async function generateEntity(name, options) {
|
|
16
|
+
if (!name || !name.trim()) {
|
|
17
|
+
throw new errors_1.CliError({ code: 'ERR_INVALID_NAME', message: 'Entity name must not be empty.' });
|
|
18
|
+
}
|
|
19
|
+
if (/[/\\]/.test(name)) {
|
|
20
|
+
throw new errors_1.CliError({
|
|
21
|
+
code: 'ERR_INVALID_NAME',
|
|
22
|
+
message: 'Entity name must not contain path separators.',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const targetDir = path.join(process.cwd(), 'schemas');
|
|
26
|
+
const targetPath = path.join(targetDir, name.toLowerCase() + '.json');
|
|
27
|
+
const userTemplatePath = path.join(process.cwd(), '.origo', 'templates', 'entity.json');
|
|
28
|
+
let content = null;
|
|
29
|
+
try {
|
|
30
|
+
await fs.access(targetPath);
|
|
31
|
+
if (!options.force) {
|
|
32
|
+
throw new errors_1.CliError({
|
|
33
|
+
code: 'ERR_FILE_EXISTS',
|
|
34
|
+
message: `File already exists: ${targetPath}. Use --force to overwrite.`,
|
|
35
|
+
context: { path: targetPath },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof errors_1.CliError)
|
|
41
|
+
throw error;
|
|
42
|
+
if (error.code !== 'ENOENT')
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
// FR-AI-005 Extensibility: Check plugins first
|
|
46
|
+
for (const plugin of plugins) {
|
|
47
|
+
if (plugin.resolveTemplate) {
|
|
48
|
+
const resolved = await plugin.resolveTemplate(name);
|
|
49
|
+
if (resolved) {
|
|
50
|
+
content = resolved;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (!content) {
|
|
56
|
+
try {
|
|
57
|
+
const rawTemplate = await fs.readFile(userTemplatePath, 'utf-8');
|
|
58
|
+
content =
|
|
59
|
+
rawTemplate.replace(/\{\{name\}\}/g, name).replace(/\{\{id\}\}/g, name.toLowerCase()) +
|
|
60
|
+
'\n';
|
|
61
|
+
// Validate user template output
|
|
62
|
+
try {
|
|
63
|
+
JSON.parse(content);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new errors_1.CliError({
|
|
67
|
+
code: 'ERR_INVALID_TEMPLATE',
|
|
68
|
+
message: `The user template at ${userTemplatePath} produced invalid JSON when substituted.`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (err instanceof errors_1.CliError)
|
|
74
|
+
throw err;
|
|
75
|
+
const code = err.code;
|
|
76
|
+
if (code && code !== 'ENOENT')
|
|
77
|
+
throw err;
|
|
78
|
+
content = (0, templates_1.generateEntityTemplate)({ id: name.toLowerCase(), name });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err.code !== 'EEXIST')
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
if (content === null) {
|
|
89
|
+
throw new errors_1.CliError({ code: 'ERR_UNEXPECTED', message: 'Content is unexpectedly null.' });
|
|
90
|
+
}
|
|
91
|
+
await fs.writeFile(targetPath, content, 'utf-8');
|
|
92
|
+
// FR-AI-005 Extensibility: Post-generate hooks
|
|
93
|
+
for (const plugin of plugins) {
|
|
94
|
+
if (plugin.postGenerate) {
|
|
95
|
+
await plugin.postGenerate({ name, targetPath });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (options.json) {
|
|
99
|
+
console.log(JSON.stringify({
|
|
100
|
+
status: 'success',
|
|
101
|
+
data: {
|
|
102
|
+
file: `./schemas/${name.toLowerCase()}.json`,
|
|
103
|
+
entityName: name,
|
|
104
|
+
},
|
|
105
|
+
}, null, 2));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.log(`Successfully generated entity ${name} at ./schemas/${name.toLowerCase()}.json`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function ejectTemplates(options) {
|
|
112
|
+
const destDir = path.join(process.cwd(), '.origo', 'templates');
|
|
113
|
+
const srcDir = path.resolve(__dirname, '../templates');
|
|
114
|
+
let files;
|
|
115
|
+
try {
|
|
116
|
+
files = await fs.readdir(srcDir);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
throw new errors_1.CliError({ code: 'ERR_NO_TEMPLATES', message: 'No template files found to eject.' });
|
|
120
|
+
}
|
|
121
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
122
|
+
if (jsonFiles.length === 0) {
|
|
123
|
+
throw new errors_1.CliError({ code: 'ERR_NO_TEMPLATES', message: 'No template files found to eject.' });
|
|
124
|
+
}
|
|
125
|
+
if (!options.force) {
|
|
126
|
+
for (const file of jsonFiles) {
|
|
127
|
+
const destFile = path.join(destDir, file);
|
|
128
|
+
try {
|
|
129
|
+
await fs.access(destFile);
|
|
130
|
+
throw new errors_1.CliError({
|
|
131
|
+
code: 'ERR_FILE_EXISTS',
|
|
132
|
+
message: `Template file already exists: ${destFile}. Use --force to overwrite.`,
|
|
133
|
+
context: { path: destFile },
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
if (err instanceof errors_1.CliError)
|
|
138
|
+
throw err;
|
|
139
|
+
if (err.code !== 'ENOENT')
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
await fs.mkdir(destDir, { recursive: true });
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (err.code !== 'EEXIST')
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
await Promise.all(jsonFiles.map(file => fs.copyFile(path.join(srcDir, file), path.join(destDir, file))));
|
|
152
|
+
if (options.json) {
|
|
153
|
+
console.log(JSON.stringify({
|
|
154
|
+
status: 'success',
|
|
155
|
+
data: {
|
|
156
|
+
destination: './.origo/templates',
|
|
157
|
+
filesEjected: jsonFiles,
|
|
158
|
+
},
|
|
159
|
+
}, null, 2));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log(`Successfully ejected ${jsonFiles.length} templates to ./.origo/templates`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../packages/cli/src/lib/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scaffoldProject = scaffoldProject;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs = tslib_1.__importStar(require("fs/promises"));
|
|
6
|
+
const path = tslib_1.__importStar(require("path"));
|
|
7
|
+
const errors_1 = require("../utils/errors");
|
|
8
|
+
const templates_1 = require("../templates");
|
|
9
|
+
async function scaffoldProject(projectName, options = {}) {
|
|
10
|
+
// Guard against path traversal, empty input, or invalid directory names
|
|
11
|
+
if (!projectName ||
|
|
12
|
+
path.basename(projectName) !== projectName ||
|
|
13
|
+
!/^[a-zA-Z0-9_.-]+$/.test(projectName)) {
|
|
14
|
+
throw new errors_1.CliError({
|
|
15
|
+
code: 'ERR_INVALID_PROJECT_NAME',
|
|
16
|
+
message: `Invalid project name "${projectName}". Project name must be a single directory name without path traversal characters.`,
|
|
17
|
+
context: { projectName },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const baseDir = options.cwd ? path.resolve(options.cwd) : process.cwd();
|
|
21
|
+
const targetDir = path.resolve(baseDir, projectName);
|
|
22
|
+
// Check if directory already exists asynchronously
|
|
23
|
+
try {
|
|
24
|
+
await fs.access(targetDir);
|
|
25
|
+
throw new errors_1.CliError({
|
|
26
|
+
code: 'EEXIST',
|
|
27
|
+
message: `Directory ${projectName} already exists.`,
|
|
28
|
+
context: { path: targetDir },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof errors_1.CliError) {
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
const isEnoent = typeof error === 'object' &&
|
|
36
|
+
error !== null &&
|
|
37
|
+
'code' in error &&
|
|
38
|
+
error.code === 'ENOENT';
|
|
39
|
+
if (!isEnoent) {
|
|
40
|
+
throw new errors_1.CliError({
|
|
41
|
+
code: 'SCAFFOLD_ERROR',
|
|
42
|
+
message: `Failed to inspect target directory: ${error instanceof Error ? error.message : String(error)}`,
|
|
43
|
+
context: { targetDir },
|
|
44
|
+
cause: error,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const schemasDir = path.join(targetDir, 'schemas');
|
|
50
|
+
const configFile = path.join(targetDir, 'origo.json');
|
|
51
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
52
|
+
await fs.mkdir(schemasDir, { recursive: true });
|
|
53
|
+
// Sourced directly from secure-by-default templates built in Story 5.5.5
|
|
54
|
+
const configContent = (0, templates_1.generateOrigoConfig)({
|
|
55
|
+
version: '1.0',
|
|
56
|
+
build: { outDir: './dist' },
|
|
57
|
+
schemas: './schemas',
|
|
58
|
+
});
|
|
59
|
+
await fs.writeFile(configFile, configContent, 'utf-8');
|
|
60
|
+
if (options.json) {
|
|
61
|
+
console.log(JSON.stringify({
|
|
62
|
+
status: 'success',
|
|
63
|
+
data: {
|
|
64
|
+
projectName,
|
|
65
|
+
targetDir,
|
|
66
|
+
configFile,
|
|
67
|
+
schemasDir,
|
|
68
|
+
},
|
|
69
|
+
}, null, 2));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log(`Successfully initialized Origo project in ${targetDir}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof errors_1.CliError) {
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
throw new errors_1.CliError({
|
|
80
|
+
code: 'SCAFFOLD_ERROR',
|
|
81
|
+
message: `Failed to scaffold project: ${error instanceof Error ? error.message : String(error)}`,
|
|
82
|
+
context: { projectName, targetDir, error },
|
|
83
|
+
cause: error,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=scaffolding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffolding.js","sourceRoot":"","sources":["../../../../../packages/cli/src/lib/scaffolding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateDirectory = validateDirectory;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
6
|
+
const path = tslib_1.__importStar(require("path"));
|
|
7
|
+
const core_1 = require("@origo/core");
|
|
8
|
+
const errors_1 = require("../utils/errors");
|
|
9
|
+
async function validateDirectory(directory = './schemas', options = {}) {
|
|
10
|
+
if (!directory || directory.trim() === '') {
|
|
11
|
+
throw new errors_1.CliError({
|
|
12
|
+
code: 'ERR_INVALID_DIRECTORY',
|
|
13
|
+
message: 'Directory argument must not be empty.',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const cwd = process.cwd();
|
|
17
|
+
const targetDir = path.resolve(cwd, directory);
|
|
18
|
+
const relativePath = path.relative(cwd, targetDir);
|
|
19
|
+
if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
|
|
20
|
+
throw new errors_1.CliError({
|
|
21
|
+
code: 'ERR_PATH_TRAVERSAL',
|
|
22
|
+
message: `Access denied: path "${directory}" resolves outside the working directory.`,
|
|
23
|
+
context: { directory, resolvedPath: targetDir, cwd },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
let files = [];
|
|
27
|
+
let targetDirBase = targetDir;
|
|
28
|
+
try {
|
|
29
|
+
const stat = await fs.promises.stat(targetDir);
|
|
30
|
+
if (stat.isFile()) {
|
|
31
|
+
targetDirBase = path.dirname(targetDir);
|
|
32
|
+
files = [path.basename(targetDir)];
|
|
33
|
+
if (!files[0].endsWith('.json')) {
|
|
34
|
+
throw new errors_1.CliError({
|
|
35
|
+
code: 'ERR_INVALID_FILE_TYPE',
|
|
36
|
+
message: 'Only .json files are supported for validation',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const dirents = await fs.promises.readdir(targetDir, {
|
|
42
|
+
recursive: true,
|
|
43
|
+
withFileTypes: true,
|
|
44
|
+
});
|
|
45
|
+
for (const d of dirents) {
|
|
46
|
+
if (d.isFile() && d.name.endsWith('.json')) {
|
|
47
|
+
const fullPath = path.join(d.parentPath || d.path, d.name);
|
|
48
|
+
files.push(path.relative(targetDirBase, fullPath));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof errors_1.CliError) {
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
const err = error;
|
|
58
|
+
if (err.code === 'ENOENT') {
|
|
59
|
+
throw new errors_1.CliError({
|
|
60
|
+
code: 'ERR_DIRECTORY_NOT_FOUND',
|
|
61
|
+
message: `Path not found: ${directory}`,
|
|
62
|
+
cause: error,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
throw new errors_1.CliError({
|
|
66
|
+
code: 'ERR_DIRECTORY_READ',
|
|
67
|
+
message: `Failed to read path: ${err.message}`,
|
|
68
|
+
cause: error,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (!options.json) {
|
|
72
|
+
console.log(`Validating schemas in ${directory}...\n`);
|
|
73
|
+
}
|
|
74
|
+
if (files.length === 0) {
|
|
75
|
+
if (!options.json) {
|
|
76
|
+
console.log('No .json files found.');
|
|
77
|
+
}
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
const results = [];
|
|
81
|
+
let totalErrors = 0;
|
|
82
|
+
let validator;
|
|
83
|
+
try {
|
|
84
|
+
validator = new core_1.BADLValidator();
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
throw new errors_1.CliError({
|
|
88
|
+
code: 'ERR_VALIDATOR_INIT',
|
|
89
|
+
message: `Failed to initialize BADLValidator: ${error instanceof Error ? error.message : String(error)}`,
|
|
90
|
+
cause: error,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
for (const file of files) {
|
|
94
|
+
const filePath = path.join(targetDirBase, file);
|
|
95
|
+
let rawContent;
|
|
96
|
+
let combinedErrors = [];
|
|
97
|
+
let isValid = true;
|
|
98
|
+
try {
|
|
99
|
+
rawContent = await fs.promises.readFile(filePath, 'utf-8');
|
|
100
|
+
rawContent = rawContent.replace(/^\uFEFF/, '');
|
|
101
|
+
const parsed = JSON.parse(rawContent);
|
|
102
|
+
const schemaType = parsed.$schema || '';
|
|
103
|
+
let isSchemaValid = false;
|
|
104
|
+
const schemaErrorsList = [];
|
|
105
|
+
let astErrorsList = [];
|
|
106
|
+
if (schemaType.includes('domain.schema.json')) {
|
|
107
|
+
isSchemaValid = validator.validateDomain(rawContent);
|
|
108
|
+
if (validator.errors)
|
|
109
|
+
schemaErrorsList.push(...validator.errors);
|
|
110
|
+
if (isSchemaValid) {
|
|
111
|
+
astErrorsList = (0, core_1.validateAST)({ schemaVersion: '1.0', domains: [parsed] });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (schemaType.includes('entity.schema.json')) {
|
|
115
|
+
isSchemaValid = validator.validateEntity(rawContent);
|
|
116
|
+
if (validator.errors)
|
|
117
|
+
schemaErrorsList.push(...validator.errors);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
schemaErrorsList.push({
|
|
121
|
+
code: 'UNSUPPORTED_SCHEMA',
|
|
122
|
+
message: `Schema type is unsupported or missing $schema. Cannot validate: ${schemaType}`,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
combinedErrors = [
|
|
126
|
+
...schemaErrorsList.map(e => ({
|
|
127
|
+
code: e.code || 'VALIDATION_ERROR',
|
|
128
|
+
message: e.message || 'Unknown error',
|
|
129
|
+
line: e.context?.line,
|
|
130
|
+
column: e.context?.column,
|
|
131
|
+
})),
|
|
132
|
+
...astErrorsList.map(e => ({
|
|
133
|
+
code: e.type || 'VALIDATION_ERROR',
|
|
134
|
+
message: e.message || 'Unknown error',
|
|
135
|
+
line: e.line,
|
|
136
|
+
column: e.column,
|
|
137
|
+
})),
|
|
138
|
+
];
|
|
139
|
+
isValid = combinedErrors.length === 0;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
combinedErrors = [
|
|
143
|
+
{
|
|
144
|
+
code: 'ERR_JSON_PARSE',
|
|
145
|
+
message: `Failed to parse JSON or read file ${file}: ${error instanceof Error ? error.message : String(error)}`,
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
isValid = false;
|
|
149
|
+
}
|
|
150
|
+
totalErrors += combinedErrors.length;
|
|
151
|
+
results.push({
|
|
152
|
+
file,
|
|
153
|
+
valid: isValid,
|
|
154
|
+
errors: combinedErrors,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (options.json) {
|
|
158
|
+
const jsonOutput = {
|
|
159
|
+
status: totalErrors === 0 ? 'success' : 'error',
|
|
160
|
+
data: {
|
|
161
|
+
directory,
|
|
162
|
+
filesValidated: files.length,
|
|
163
|
+
errorsFound: totalErrors,
|
|
164
|
+
results,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
168
|
+
return totalErrors;
|
|
169
|
+
}
|
|
170
|
+
let validFilesCount = 0;
|
|
171
|
+
let invalidFilesCount = 0;
|
|
172
|
+
for (const result of results) {
|
|
173
|
+
if (result.valid) {
|
|
174
|
+
console.log(` \x1b[32m✓\x1b[0m ${result.file}`);
|
|
175
|
+
validFilesCount++;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.log(` \x1b[31m✗\x1b[0m ${result.file}`);
|
|
179
|
+
invalidFilesCount++;
|
|
180
|
+
for (const error of result.errors) {
|
|
181
|
+
const line = error.line !== undefined ? error.line : '-';
|
|
182
|
+
const col = error.column !== undefined ? error.column : '-';
|
|
183
|
+
console.log(` ${line}:${col} [${error.code}] ${error.message}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const fileWord = (count) => (count === 1 ? 'file' : 'files');
|
|
188
|
+
console.log(`\nFound ${totalErrors} errors in ${invalidFilesCount} ${fileWord(invalidFilesCount)} (${validFilesCount} ${fileWord(validFilesCount)} valid, ${invalidFilesCount} ${fileWord(invalidFilesCount)} invalid).`);
|
|
189
|
+
return totalErrors;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../packages/cli/src/lib/validation.ts"],"names":[],"mappings":"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"}
|
package/src/main.d.ts
ADDED
package/src/main.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.createProgram = createProgram;
|
|
5
|
+
exports.main = main;
|
|
6
|
+
const commander_1 = require("commander");
|
|
7
|
+
const init_1 = require("./commands/init");
|
|
8
|
+
const new_1 = require("./commands/new");
|
|
9
|
+
const validate_1 = require("./commands/validate");
|
|
10
|
+
const generate_1 = require("./commands/generate");
|
|
11
|
+
const errors_1 = require("./utils/errors");
|
|
12
|
+
function createProgram() {
|
|
13
|
+
const program = new commander_1.Command();
|
|
14
|
+
program.name('origo').description('CLI for Origo Design').version('0.0.1');
|
|
15
|
+
program.addCommand((0, init_1.initCommand)());
|
|
16
|
+
program.addCommand((0, new_1.newCommand)());
|
|
17
|
+
program.addCommand((0, validate_1.validateCommand)());
|
|
18
|
+
program.addCommand((0, generate_1.generateCommand)());
|
|
19
|
+
return program;
|
|
20
|
+
}
|
|
21
|
+
function main() {
|
|
22
|
+
const program = createProgram();
|
|
23
|
+
program.parseAsync(process.argv).catch(err => {
|
|
24
|
+
try {
|
|
25
|
+
(0, errors_1.handleError)(err);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
console.error('Fatal error in error handler:', e);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
if (require.main === module) {
|
|
36
|
+
main();
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=main.js.map
|
package/src/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../packages/cli/src/main.ts"],"names":[],"mappings":";;;AAQA,sCAWC;AAED,oBAYC;AAhCD,yCAAoC;AACpC,0CAA8C;AAC9C,wCAA4C;AAC5C,kDAAsD;AACtD,kDAAsD;AACtD,2CAA6C;AAE7C,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3E,OAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,IAAA,gBAAU,GAAE,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAC;IAEtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,IAAI;IAClB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAC3C,IAAI,CAAC;YACH,IAAA,oBAAW,EAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface EntityOptions {
|
|
2
|
+
id?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ExtensionOptions {
|
|
6
|
+
id?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface OrigoConfigOptions {
|
|
11
|
+
version?: string;
|
|
12
|
+
build?: {
|
|
13
|
+
outDir?: string;
|
|
14
|
+
};
|
|
15
|
+
schemas?: string;
|
|
16
|
+
security?: {
|
|
17
|
+
sandboxEnabled?: boolean;
|
|
18
|
+
allowNetworkAccess?: boolean;
|
|
19
|
+
allowFileSystemAccess?: boolean;
|
|
20
|
+
};
|
|
21
|
+
permissions?: {
|
|
22
|
+
read?: string[];
|
|
23
|
+
write?: string[];
|
|
24
|
+
};
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
export declare function generateEntityTemplate(options?: EntityOptions): string;
|
|
28
|
+
export declare function generateExtensionTemplate(options?: ExtensionOptions): string;
|
|
29
|
+
export declare function generateOrigoConfig(options?: OrigoConfigOptions): string;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateEntityTemplate = generateEntityTemplate;
|
|
4
|
+
exports.generateExtensionTemplate = generateExtensionTemplate;
|
|
5
|
+
exports.generateOrigoConfig = generateOrigoConfig;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const origo_json_1 = tslib_1.__importDefault(require("./origo.json"));
|
|
8
|
+
const entity_json_1 = tslib_1.__importDefault(require("./entity.json"));
|
|
9
|
+
const extension_json_1 = tslib_1.__importDefault(require("./extension.json"));
|
|
10
|
+
function validateIdentifier(id) {
|
|
11
|
+
if (!id || !/^[a-zA-Z0-9_-]+$/.test(id)) {
|
|
12
|
+
throw new Error(`Invalid identifier: ${id}. Must match ^[a-zA-Z0-9_-]+$`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function validateSemver(version) {
|
|
16
|
+
if (!version || !/^\d+\.\d+\.\d+/.test(version)) {
|
|
17
|
+
throw new Error(`Invalid version: ${version}. Must be a valid semver.`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function generateEntityTemplate(options = {}) {
|
|
21
|
+
const id = options.id || 'default-entity-id';
|
|
22
|
+
const name = options.name || 'DefaultEntityName';
|
|
23
|
+
validateIdentifier(id);
|
|
24
|
+
const entityObj = {
|
|
25
|
+
...entity_json_1.default,
|
|
26
|
+
id,
|
|
27
|
+
name,
|
|
28
|
+
};
|
|
29
|
+
return JSON.stringify(entityObj, null, 2) + '\n';
|
|
30
|
+
}
|
|
31
|
+
function generateExtensionTemplate(options = {}) {
|
|
32
|
+
const id = options.id || 'my-extension';
|
|
33
|
+
const name = options.name || 'My Extension';
|
|
34
|
+
const version = options.version || '1.0.0';
|
|
35
|
+
validateIdentifier(id);
|
|
36
|
+
validateSemver(version);
|
|
37
|
+
const extensionObj = {
|
|
38
|
+
...extension_json_1.default,
|
|
39
|
+
id,
|
|
40
|
+
name,
|
|
41
|
+
version,
|
|
42
|
+
};
|
|
43
|
+
return JSON.stringify(extensionObj, null, 2) + '\n';
|
|
44
|
+
}
|
|
45
|
+
function generateOrigoConfig(options = {}) {
|
|
46
|
+
const defaults = origo_json_1.default;
|
|
47
|
+
const merged = {
|
|
48
|
+
...defaults,
|
|
49
|
+
...options,
|
|
50
|
+
build: { ...defaults.build, ...(options.build || {}) },
|
|
51
|
+
security: { ...defaults.security, ...(options.security || {}) },
|
|
52
|
+
permissions: { ...defaults.permissions, ...(options.permissions || {}) },
|
|
53
|
+
};
|
|
54
|
+
try {
|
|
55
|
+
return JSON.stringify(merged, null, 2) + '\n';
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
throw new Error(`Failed to serialize origo config: ${e instanceof Error ? e.message : String(e)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/cli/src/templates/index.ts"],"names":[],"mappings":";;AA2CA,wDAYC;AAED,8DAgBC;AAED,kDAkBC;;AA7FD,sEAAyC;AACzC,wEAA2C;AAC3C,8EAAiD;AA6BjD,SAAS,kBAAkB,CAAC,EAAU;IACpC,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,+BAA+B,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,2BAA2B,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CAAC,UAAyB,EAAE;IAChE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,mBAAmB,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,mBAAmB,CAAC;IACjD,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG;QAChB,GAAG,qBAAc;QACjB,EAAE;QACF,IAAI;KACL,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACnD,CAAC;AAED,SAAgB,yBAAyB,CAAC,UAA4B,EAAE;IACtE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,cAAc,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;IAE3C,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACvB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,MAAM,YAAY,GAAG;QACnB,GAAG,wBAAiB;QACpB,EAAE;QACF,IAAI;QACJ,OAAO;KACR,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACtD,CAAC;AAED,SAAgB,mBAAmB,CAAC,UAA8B,EAAE;IAClE,MAAM,QAAQ,GAAG,oBAAa,CAAC;IAE/B,MAAM,MAAM,GAAG;QACb,GAAG,QAAQ;QACX,GAAG,OAAO;QACV,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;QACtD,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;QAC/D,WAAW,EAAE,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;KACzE,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,qCAAqC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0",
|
|
3
|
+
"build": {
|
|
4
|
+
"outDir": "./dist"
|
|
5
|
+
},
|
|
6
|
+
"schemas": "./schemas",
|
|
7
|
+
"security": {
|
|
8
|
+
"sandboxEnabled": true,
|
|
9
|
+
"allowNetworkAccess": false,
|
|
10
|
+
"allowFileSystemAccess": false
|
|
11
|
+
},
|
|
12
|
+
"permissions": {
|
|
13
|
+
"read": ["admin"],
|
|
14
|
+
"write": ["admin"]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface OrigoCliError {
|
|
2
|
+
code: string;
|
|
3
|
+
message: string;
|
|
4
|
+
context?: Record<string, unknown>;
|
|
5
|
+
cause?: unknown;
|
|
6
|
+
}
|
|
7
|
+
export declare class CliError extends Error {
|
|
8
|
+
code: string;
|
|
9
|
+
context?: Record<string, unknown>;
|
|
10
|
+
constructor(error: OrigoCliError);
|
|
11
|
+
}
|
|
12
|
+
export interface ErrorOptions {
|
|
13
|
+
json?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function handleError(error: unknown, options?: ErrorOptions): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CliError = void 0;
|
|
4
|
+
exports.handleError = handleError;
|
|
5
|
+
class CliError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
context;
|
|
8
|
+
constructor(error) {
|
|
9
|
+
super(error.message, { cause: error.cause });
|
|
10
|
+
this.name = 'CliError';
|
|
11
|
+
this.code = error.code;
|
|
12
|
+
this.context = error.context;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.CliError = CliError;
|
|
16
|
+
function handleError(error, options = {}) {
|
|
17
|
+
if (options.json) {
|
|
18
|
+
if (error instanceof CliError) {
|
|
19
|
+
console.error(JSON.stringify({
|
|
20
|
+
error: {
|
|
21
|
+
code: error.code,
|
|
22
|
+
message: error.message,
|
|
23
|
+
context: error.context,
|
|
24
|
+
},
|
|
25
|
+
}, null, 2));
|
|
26
|
+
}
|
|
27
|
+
else if (error instanceof Error) {
|
|
28
|
+
console.error(JSON.stringify({
|
|
29
|
+
error: {
|
|
30
|
+
code: 'UNEXPECTED_ERROR',
|
|
31
|
+
message: error.message,
|
|
32
|
+
},
|
|
33
|
+
}, null, 2));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.error(JSON.stringify({
|
|
37
|
+
error: {
|
|
38
|
+
code: 'UNKNOWN_ERROR',
|
|
39
|
+
message: String(error),
|
|
40
|
+
},
|
|
41
|
+
}, null, 2));
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (error instanceof CliError) {
|
|
46
|
+
console.error(`Error [${error.code}]: ${error.message}`);
|
|
47
|
+
if (error.context) {
|
|
48
|
+
console.error(JSON.stringify(error.context, null, 2));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (error instanceof Error) {
|
|
52
|
+
console.error(`Unexpected Error: ${error.message}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.error('An unknown error occurred.');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../packages/cli/src/utils/errors.ts"],"names":[],"mappings":";;;AAuBA,kCAwDC;AAxED,MAAa,QAAS,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACb,OAAO,CAA2B;IAEzC,YAAY,KAAoB;QAC9B,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,CAAC;CACF;AAVD,4BAUC;AAMD,SAAgB,WAAW,CAAC,KAAc,EAAE,UAAwB,EAAE;IACpE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CACZ;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB;aACF,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CACZ;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB;aACF,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CACZ;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;iBACvB;aACF,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|