@smooai/config 2.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/LICENSE +21 -0
- package/README.md +430 -0
- package/dist/chunk-3SU3SMKN.mjs +73 -0
- package/dist/chunk-3SU3SMKN.mjs.map +1 -0
- package/dist/chunk-CASNDTCH.mjs +12 -0
- package/dist/chunk-CASNDTCH.mjs.map +1 -0
- package/dist/chunk-GLLYQ6FK.mjs +173 -0
- package/dist/chunk-GLLYQ6FK.mjs.map +1 -0
- package/dist/chunk-HPSOF46N.mjs +71 -0
- package/dist/chunk-HPSOF46N.mjs.map +1 -0
- package/dist/chunk-HPXCKD6M.mjs +118 -0
- package/dist/chunk-HPXCKD6M.mjs.map +1 -0
- package/dist/chunk-J5LGTIGS.mjs +10 -0
- package/dist/chunk-J5LGTIGS.mjs.map +1 -0
- package/dist/chunk-LKV73SD2.mjs +25 -0
- package/dist/chunk-LKV73SD2.mjs.map +1 -0
- package/dist/chunk-MJ52ZIWV.mjs +98 -0
- package/dist/chunk-MJ52ZIWV.mjs.map +1 -0
- package/dist/chunk-O7BSFCCY.mjs +89 -0
- package/dist/chunk-O7BSFCCY.mjs.map +1 -0
- package/dist/chunk-QBM74JB5.mjs +47 -0
- package/dist/chunk-QBM74JB5.mjs.map +1 -0
- package/dist/chunk-QGMLTMB5.mjs +37 -0
- package/dist/chunk-QGMLTMB5.mjs.map +1 -0
- package/dist/chunk-SKX7CPGS.mjs +73 -0
- package/dist/chunk-SKX7CPGS.mjs.map +1 -0
- package/dist/chunk-VPKO6D4W.mjs +33 -0
- package/dist/chunk-VPKO6D4W.mjs.map +1 -0
- package/dist/chunk-YQWYYS7P.mjs +12194 -0
- package/dist/chunk-YQWYYS7P.mjs.map +1 -0
- package/dist/chunk-Z3CZGNU5.mjs +99 -0
- package/dist/chunk-Z3CZGNU5.mjs.map +1 -0
- package/dist/chunk-ZOKHXR5I.mjs +33 -0
- package/dist/chunk-ZOKHXR5I.mjs.map +1 -0
- package/dist/cli.mjs +1562 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/config/FeatureFlagKey.d.mts +24 -0
- package/dist/config/FeatureFlagKey.d.ts +24 -0
- package/dist/config/FeatureFlagKey.js +31 -0
- package/dist/config/FeatureFlagKey.js.map +1 -0
- package/dist/config/FeatureFlagKey.mjs +8 -0
- package/dist/config/FeatureFlagKey.mjs.map +1 -0
- package/dist/config/PublicConfigKey.d.mts +22 -0
- package/dist/config/PublicConfigKey.d.ts +22 -0
- package/dist/config/PublicConfigKey.js +36 -0
- package/dist/config/PublicConfigKey.js.map +1 -0
- package/dist/config/PublicConfigKey.mjs +8 -0
- package/dist/config/PublicConfigKey.mjs.map +1 -0
- package/dist/config/SecretConfigKey.d.mts +22 -0
- package/dist/config/SecretConfigKey.d.ts +22 -0
- package/dist/config/SecretConfigKey.js +31 -0
- package/dist/config/SecretConfigKey.js.map +1 -0
- package/dist/config/SecretConfigKey.mjs +8 -0
- package/dist/config/SecretConfigKey.mjs.map +1 -0
- package/dist/config/config.d.mts +178 -0
- package/dist/config/config.d.ts +178 -0
- package/dist/config/config.js +12364 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/config.mjs +23 -0
- package/dist/config/config.mjs.map +1 -0
- package/dist/config/findAndProcessEnvConfig.d.mts +17 -0
- package/dist/config/findAndProcessEnvConfig.d.ts +17 -0
- package/dist/config/findAndProcessEnvConfig.js +12290 -0
- package/dist/config/findAndProcessEnvConfig.js.map +1 -0
- package/dist/config/findAndProcessEnvConfig.mjs +14 -0
- package/dist/config/findAndProcessEnvConfig.mjs.map +1 -0
- package/dist/config/findAndProcessFileConfig.d.mts +38 -0
- package/dist/config/findAndProcessFileConfig.d.ts +38 -0
- package/dist/config/findAndProcessFileConfig.js +12431 -0
- package/dist/config/findAndProcessFileConfig.js.map +1 -0
- package/dist/config/findAndProcessFileConfig.mjs +18 -0
- package/dist/config/findAndProcessFileConfig.mjs.map +1 -0
- package/dist/config/getCloudRegion.d.mts +8 -0
- package/dist/config/getCloudRegion.d.ts +8 -0
- package/dist/config/getCloudRegion.js +92 -0
- package/dist/config/getCloudRegion.js.map +1 -0
- package/dist/config/getCloudRegion.mjs +9 -0
- package/dist/config/getCloudRegion.mjs.map +1 -0
- package/dist/config/index.d.mts +5 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +12638 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +33 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/config/parseConfigSchema.d.mts +13 -0
- package/dist/config/parseConfigSchema.d.ts +13 -0
- package/dist/config/parseConfigSchema.js +12177 -0
- package/dist/config/parseConfigSchema.js.map +1 -0
- package/dist/config/parseConfigSchema.mjs +16 -0
- package/dist/config/parseConfigSchema.mjs.map +1 -0
- package/dist/config/standardSchemaToJson.d.mts +6 -0
- package/dist/config/standardSchemaToJson.d.ts +6 -0
- package/dist/config/standardSchemaToJson.js +138 -0
- package/dist/config/standardSchemaToJson.js.map +1 -0
- package/dist/config/standardSchemaToJson.mjs +9 -0
- package/dist/config/standardSchemaToJson.mjs.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/config.d.mts +4108 -0
- package/dist/integration-tests/1/smooai-config/config.d.ts +4108 -0
- package/dist/integration-tests/1/smooai-config/config.js +12353 -0
- package/dist/integration-tests/1/smooai-config/config.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/config.mjs +12 -0
- package/dist/integration-tests/1/smooai-config/config.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/default.d.mts +55 -0
- package/dist/integration-tests/1/smooai-config/default.d.ts +55 -0
- package/dist/integration-tests/1/smooai-config/default.js +12419 -0
- package/dist/integration-tests/1/smooai-config/default.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/default.mjs +78 -0
- package/dist/integration-tests/1/smooai-config/default.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/development.d.mts +41 -0
- package/dist/integration-tests/1/smooai-config/development.d.ts +41 -0
- package/dist/integration-tests/1/smooai-config/development.js +12403 -0
- package/dist/integration-tests/1/smooai-config/development.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/development.mjs +62 -0
- package/dist/integration-tests/1/smooai-config/development.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.aws.d.mts +128 -0
- package/dist/integration-tests/1/smooai-config/production.aws.d.ts +128 -0
- package/dist/integration-tests/1/smooai-config/production.aws.js +12371 -0
- package/dist/integration-tests/1/smooai-config/production.aws.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.aws.mjs +30 -0
- package/dist/integration-tests/1/smooai-config/production.aws.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-1.d.mts +64 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-1.d.ts +64 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-1.js +12364 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-1.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-1.mjs +23 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-1.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-2.d.mts +64 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-2.d.ts +64 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-2.js +12364 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-2.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-2.mjs +23 -0
- package/dist/integration-tests/1/smooai-config/production.aws.us-east-2.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.d.mts +42 -0
- package/dist/integration-tests/1/smooai-config/production.d.ts +42 -0
- package/dist/integration-tests/1/smooai-config/production.js +12399 -0
- package/dist/integration-tests/1/smooai-config/production.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/production.mjs +58 -0
- package/dist/integration-tests/1/smooai-config/production.mjs.map +1 -0
- package/dist/integration-tests/1/smooai-config/staging.d.mts +129 -0
- package/dist/integration-tests/1/smooai-config/staging.d.ts +129 -0
- package/dist/integration-tests/1/smooai-config/staging.js +12377 -0
- package/dist/integration-tests/1/smooai-config/staging.js.map +1 -0
- package/dist/integration-tests/1/smooai-config/staging.mjs +36 -0
- package/dist/integration-tests/1/smooai-config/staging.mjs.map +1 -0
- package/dist/integration-tests/2/smooai-config/config.d.mts +1262 -0
- package/dist/integration-tests/2/smooai-config/config.d.ts +1262 -0
- package/dist/integration-tests/2/smooai-config/config.js +12301 -0
- package/dist/integration-tests/2/smooai-config/config.js.map +1 -0
- package/dist/integration-tests/2/smooai-config/config.mjs +12 -0
- package/dist/integration-tests/2/smooai-config/config.mjs.map +1 -0
- package/dist/integration-tests/2/smooai-config/default.d.mts +19 -0
- package/dist/integration-tests/2/smooai-config/default.d.ts +19 -0
- package/dist/integration-tests/2/smooai-config/default.js +12321 -0
- package/dist/integration-tests/2/smooai-config/default.js.map +1 -0
- package/dist/integration-tests/2/smooai-config/default.mjs +32 -0
- package/dist/integration-tests/2/smooai-config/default.mjs.map +1 -0
- package/dist/integration-tests/2/smooai-config/development.d.mts +9 -0
- package/dist/integration-tests/2/smooai-config/development.d.ts +9 -0
- package/dist/integration-tests/2/smooai-config/development.js +12311 -0
- package/dist/integration-tests/2/smooai-config/development.js.map +1 -0
- package/dist/integration-tests/2/smooai-config/development.mjs +22 -0
- package/dist/integration-tests/2/smooai-config/development.mjs.map +1 -0
- package/dist/integration-tests/2/smooai-config/production.aws.d.mts +26 -0
- package/dist/integration-tests/2/smooai-config/production.aws.d.ts +26 -0
- package/dist/integration-tests/2/smooai-config/production.aws.js +12311 -0
- package/dist/integration-tests/2/smooai-config/production.aws.js.map +1 -0
- package/dist/integration-tests/2/smooai-config/production.aws.mjs +22 -0
- package/dist/integration-tests/2/smooai-config/production.aws.mjs.map +1 -0
- package/dist/integration-tests/2/smooai-config/production.aws.us-east-1.d.mts +25 -0
- package/dist/integration-tests/2/smooai-config/production.aws.us-east-1.d.ts +25 -0
- package/dist/integration-tests/2/smooai-config/production.aws.us-east-1.js +12310 -0
- package/dist/integration-tests/2/smooai-config/production.aws.us-east-1.js.map +1 -0
- package/dist/integration-tests/2/smooai-config/production.aws.us-east-1.mjs +21 -0
- package/dist/integration-tests/2/smooai-config/production.aws.us-east-1.mjs.map +1 -0
- package/dist/integration-tests/2/smooai-config/production.d.mts +19 -0
- package/dist/integration-tests/2/smooai-config/production.d.ts +19 -0
- package/dist/integration-tests/2/smooai-config/production.js +12321 -0
- package/dist/integration-tests/2/smooai-config/production.js.map +1 -0
- package/dist/integration-tests/2/smooai-config/production.mjs +32 -0
- package/dist/integration-tests/2/smooai-config/production.mjs.map +1 -0
- package/dist/platform/client.d.mts +49 -0
- package/dist/platform/client.d.ts +49 -0
- package/dist/platform/client.js +123 -0
- package/dist/platform/client.js.map +1 -0
- package/dist/platform/client.mjs +8 -0
- package/dist/platform/client.mjs.map +1 -0
- package/dist/platform/server/server.async.d.mts +12 -0
- package/dist/platform/server/server.async.d.ts +12 -0
- package/dist/platform/server/server.async.js +12586 -0
- package/dist/platform/server/server.async.js.map +1 -0
- package/dist/platform/server/server.async.mjs +18 -0
- package/dist/platform/server/server.async.mjs.map +1 -0
- package/dist/platform/server/server.featureFlag.sync.d.mts +2 -0
- package/dist/platform/server/server.featureFlag.sync.d.ts +2 -0
- package/dist/platform/server/server.featureFlag.sync.js +12589 -0
- package/dist/platform/server/server.featureFlag.sync.js.map +1 -0
- package/dist/platform/server/server.featureFlag.sync.mjs +24 -0
- package/dist/platform/server/server.featureFlag.sync.mjs.map +1 -0
- package/dist/platform/server/server.publicConfig.sync.d.mts +2 -0
- package/dist/platform/server/server.publicConfig.sync.d.ts +2 -0
- package/dist/platform/server/server.publicConfig.sync.js +12589 -0
- package/dist/platform/server/server.publicConfig.sync.js.map +1 -0
- package/dist/platform/server/server.publicConfig.sync.mjs +24 -0
- package/dist/platform/server/server.publicConfig.sync.mjs.map +1 -0
- package/dist/platform/server/server.secretConfig.sync.d.mts +2 -0
- package/dist/platform/server/server.secretConfig.sync.d.ts +2 -0
- package/dist/platform/server/server.secretConfig.sync.js +12589 -0
- package/dist/platform/server/server.secretConfig.sync.js.map +1 -0
- package/dist/platform/server/server.secretConfig.sync.mjs +24 -0
- package/dist/platform/server/server.secretConfig.sync.mjs.map +1 -0
- package/dist/platform/server.d.mts +21 -0
- package/dist/platform/server.d.ts +21 -0
- package/dist/platform/server.js +12626 -0
- package/dist/platform/server.js.map +1 -0
- package/dist/platform/server.mjs +58 -0
- package/dist/platform/server.mjs.map +1 -0
- package/dist/react/hooks.d.mts +36 -0
- package/dist/react/hooks.d.ts +36 -0
- package/dist/react/hooks.js +90 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react/hooks.mjs +14 -0
- package/dist/react/hooks.mjs.map +1 -0
- package/dist/react/index.d.mts +28 -0
- package/dist/react/index.d.ts +28 -0
- package/dist/react/index.js +194 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +17 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/schema-spec/smooai-config-schema-spec.d.mts +25 -0
- package/dist/schema-spec/smooai-config-schema-spec.d.ts +25 -0
- package/dist/schema-spec/smooai-config-schema-spec.js +177 -0
- package/dist/schema-spec/smooai-config-schema-spec.js.map +1 -0
- package/dist/schema-spec/smooai-config-schema-spec.mjs +154 -0
- package/dist/schema-spec/smooai-config-schema-spec.mjs.map +1 -0
- package/dist/utils/fs.d.mts +10 -0
- package/dist/utils/fs.d.ts +10 -0
- package/dist/utils/fs.js +74 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/fs.mjs +11 -0
- package/dist/utils/fs.mjs.map +1 -0
- package/dist/utils/index.d.mts +29 -0
- package/dist/utils/index.d.ts +29 -0
- package/dist/utils/index.js +113 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +18 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/mergeReplaceArrays.d.mts +9 -0
- package/dist/utils/mergeReplaceArrays.d.ts +9 -0
- package/dist/utils/mergeReplaceArrays.js +63 -0
- package/dist/utils/mergeReplaceArrays.js.map +1 -0
- package/dist/utils/mergeReplaceArrays.mjs +9 -0
- package/dist/utils/mergeReplaceArrays.mjs.map +1 -0
- package/package.json +133 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/schema-spec/smooai-config-schema-spec.ts
|
|
21
|
+
var smooai_config_schema_spec_exports = {};
|
|
22
|
+
__export(smooai_config_schema_spec_exports, {
|
|
23
|
+
validateSmooaiSchema: () => validateSmooaiSchema
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(smooai_config_schema_spec_exports);
|
|
26
|
+
var SUPPORTED_KEYWORDS = /* @__PURE__ */ new Set([
|
|
27
|
+
// Core
|
|
28
|
+
"type",
|
|
29
|
+
"properties",
|
|
30
|
+
"required",
|
|
31
|
+
"enum",
|
|
32
|
+
"const",
|
|
33
|
+
"default",
|
|
34
|
+
// Metadata
|
|
35
|
+
"title",
|
|
36
|
+
"description",
|
|
37
|
+
"$schema",
|
|
38
|
+
// String
|
|
39
|
+
"minLength",
|
|
40
|
+
"maxLength",
|
|
41
|
+
"pattern",
|
|
42
|
+
"format",
|
|
43
|
+
// Numeric
|
|
44
|
+
"minimum",
|
|
45
|
+
"maximum",
|
|
46
|
+
"exclusiveMinimum",
|
|
47
|
+
"exclusiveMaximum",
|
|
48
|
+
"multipleOf",
|
|
49
|
+
// Array
|
|
50
|
+
"items",
|
|
51
|
+
"minItems",
|
|
52
|
+
"maxItems",
|
|
53
|
+
"uniqueItems",
|
|
54
|
+
// Object
|
|
55
|
+
"additionalProperties",
|
|
56
|
+
// Composition
|
|
57
|
+
"anyOf",
|
|
58
|
+
"oneOf",
|
|
59
|
+
"allOf",
|
|
60
|
+
// References
|
|
61
|
+
"$ref",
|
|
62
|
+
"$defs",
|
|
63
|
+
"definitions"
|
|
64
|
+
]);
|
|
65
|
+
var REJECTED_KEYWORDS = {
|
|
66
|
+
if: {
|
|
67
|
+
message: "Conditional schemas (if/then/else) are not supported across all SDK languages.",
|
|
68
|
+
suggestion: 'Use "oneOf" or "anyOf" with discriminator properties instead.'
|
|
69
|
+
},
|
|
70
|
+
then: {
|
|
71
|
+
message: "Conditional schemas (if/then/else) are not supported across all SDK languages.",
|
|
72
|
+
suggestion: 'Use "oneOf" or "anyOf" with discriminator properties instead.'
|
|
73
|
+
},
|
|
74
|
+
else: {
|
|
75
|
+
message: "Conditional schemas (if/then/else) are not supported across all SDK languages.",
|
|
76
|
+
suggestion: 'Use "oneOf" or "anyOf" with discriminator properties instead.'
|
|
77
|
+
},
|
|
78
|
+
patternProperties: {
|
|
79
|
+
message: '"patternProperties" is not supported across all SDK languages.',
|
|
80
|
+
suggestion: 'Use explicit "properties" with known key names, or "additionalProperties" with a type constraint.'
|
|
81
|
+
},
|
|
82
|
+
propertyNames: {
|
|
83
|
+
message: '"propertyNames" is not supported across all SDK languages.',
|
|
84
|
+
suggestion: "Validate property names in application code instead."
|
|
85
|
+
},
|
|
86
|
+
dependencies: {
|
|
87
|
+
message: '"dependencies" is not supported across all SDK languages.',
|
|
88
|
+
suggestion: 'Use "required" within "oneOf"/"anyOf" variants to express conditional requirements.'
|
|
89
|
+
},
|
|
90
|
+
contains: {
|
|
91
|
+
message: '"contains" is not supported across all SDK languages.',
|
|
92
|
+
suggestion: 'Use "items" with a union type ("anyOf") instead.'
|
|
93
|
+
},
|
|
94
|
+
not: {
|
|
95
|
+
message: '"not" is not supported across all SDK languages.',
|
|
96
|
+
suggestion: 'Express the constraint positively using "enum", "oneOf", or validation in application code.'
|
|
97
|
+
},
|
|
98
|
+
prefixItems: {
|
|
99
|
+
message: '"prefixItems" (tuple validation) is not supported across all SDK languages.',
|
|
100
|
+
suggestion: 'Use an "object" with named fields instead of a positional tuple.'
|
|
101
|
+
},
|
|
102
|
+
unevaluatedProperties: {
|
|
103
|
+
message: '"unevaluatedProperties" is not supported across all SDK languages.',
|
|
104
|
+
suggestion: 'Use "additionalProperties" instead.'
|
|
105
|
+
},
|
|
106
|
+
unevaluatedItems: {
|
|
107
|
+
message: '"unevaluatedItems" is not supported across all SDK languages.',
|
|
108
|
+
suggestion: 'Use "items" with a specific schema instead.'
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
var SUPPORTED_FORMATS = /* @__PURE__ */ new Set(["email", "uri", "uuid", "date-time", "ipv4", "ipv6"]);
|
|
112
|
+
function validateSmooaiSchema(schema) {
|
|
113
|
+
const errors = [];
|
|
114
|
+
walkSchema(schema, "", errors);
|
|
115
|
+
return { valid: errors.length === 0, errors };
|
|
116
|
+
}
|
|
117
|
+
function walkSchema(node, path, errors) {
|
|
118
|
+
if (typeof node !== "object" || node === null || Array.isArray(node)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const obj = node;
|
|
122
|
+
for (const key of Object.keys(obj)) {
|
|
123
|
+
if (key in REJECTED_KEYWORDS) {
|
|
124
|
+
const info = REJECTED_KEYWORDS[key];
|
|
125
|
+
errors.push({
|
|
126
|
+
path: path || "/",
|
|
127
|
+
keyword: key,
|
|
128
|
+
message: info.message,
|
|
129
|
+
suggestion: info.suggestion
|
|
130
|
+
});
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (SUPPORTED_KEYWORDS.has(key)) {
|
|
134
|
+
if (key === "format" && typeof obj[key] === "string" && !SUPPORTED_FORMATS.has(obj[key])) {
|
|
135
|
+
errors.push({
|
|
136
|
+
path: path || "/",
|
|
137
|
+
keyword: "format",
|
|
138
|
+
message: `Format "${obj[key]}" is not supported across all SDK languages.`,
|
|
139
|
+
suggestion: `Supported formats: ${[...SUPPORTED_FORMATS].join(", ")}. Use "pattern" for custom string validation.`
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (obj.properties && typeof obj.properties === "object") {
|
|
146
|
+
const props = obj.properties;
|
|
147
|
+
for (const [propName, propSchema] of Object.entries(props)) {
|
|
148
|
+
walkSchema(propSchema, `${path}/properties/${propName}`, errors);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (obj.items && typeof obj.items === "object") {
|
|
152
|
+
walkSchema(obj.items, `${path}/items`, errors);
|
|
153
|
+
}
|
|
154
|
+
if (obj.additionalProperties && typeof obj.additionalProperties === "object") {
|
|
155
|
+
walkSchema(obj.additionalProperties, `${path}/additionalProperties`, errors);
|
|
156
|
+
}
|
|
157
|
+
for (const compKey of ["anyOf", "oneOf", "allOf"]) {
|
|
158
|
+
if (Array.isArray(obj[compKey])) {
|
|
159
|
+
obj[compKey].forEach((subSchema, i) => {
|
|
160
|
+
walkSchema(subSchema, `${path}/${compKey}/${i}`, errors);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (const defsKey of ["$defs", "definitions"]) {
|
|
165
|
+
if (obj[defsKey] && typeof obj[defsKey] === "object") {
|
|
166
|
+
const defs = obj[defsKey];
|
|
167
|
+
for (const [defName, defSchema] of Object.entries(defs)) {
|
|
168
|
+
walkSchema(defSchema, `${path}/${defsKey}/${defName}`, errors);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
174
|
+
0 && (module.exports = {
|
|
175
|
+
validateSmooaiSchema
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=smooai-config-schema-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/schema-spec/smooai-config-schema-spec.ts"],"sourcesContent":["/**\n * Cross-language JSON Schema validation for the Smoo AI config SDK.\n *\n * Validates that a JSON Schema uses only the subset of keywords that all\n * four language SDKs (TypeScript, Python, Rust, Go) can reliably support.\n */\n\nexport interface SchemaValidationError {\n path: string;\n keyword: string;\n message: string;\n suggestion: string;\n}\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: SchemaValidationError[];\n}\n\n/** Keywords supported across all four SDK languages. */\nconst SUPPORTED_KEYWORDS = new Set([\n // Core\n 'type',\n 'properties',\n 'required',\n 'enum',\n 'const',\n 'default',\n // Metadata\n 'title',\n 'description',\n '$schema',\n // String\n 'minLength',\n 'maxLength',\n 'pattern',\n 'format',\n // Numeric\n 'minimum',\n 'maximum',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'multipleOf',\n // Array\n 'items',\n 'minItems',\n 'maxItems',\n 'uniqueItems',\n // Object\n 'additionalProperties',\n // Composition\n 'anyOf',\n 'oneOf',\n 'allOf',\n // References\n '$ref',\n '$defs',\n 'definitions',\n]);\n\n/** Keywords explicitly rejected with actionable error messages. */\nconst REJECTED_KEYWORDS: Record<string, { message: string; suggestion: string }> = {\n if: {\n message: 'Conditional schemas (if/then/else) are not supported across all SDK languages.',\n suggestion: 'Use \"oneOf\" or \"anyOf\" with discriminator properties instead.',\n },\n then: {\n message: 'Conditional schemas (if/then/else) are not supported across all SDK languages.',\n suggestion: 'Use \"oneOf\" or \"anyOf\" with discriminator properties instead.',\n },\n else: {\n message: 'Conditional schemas (if/then/else) are not supported across all SDK languages.',\n suggestion: 'Use \"oneOf\" or \"anyOf\" with discriminator properties instead.',\n },\n patternProperties: {\n message: '\"patternProperties\" is not supported across all SDK languages.',\n suggestion: 'Use explicit \"properties\" with known key names, or \"additionalProperties\" with a type constraint.',\n },\n propertyNames: {\n message: '\"propertyNames\" is not supported across all SDK languages.',\n suggestion: 'Validate property names in application code instead.',\n },\n dependencies: {\n message: '\"dependencies\" is not supported across all SDK languages.',\n suggestion: 'Use \"required\" within \"oneOf\"/\"anyOf\" variants to express conditional requirements.',\n },\n contains: {\n message: '\"contains\" is not supported across all SDK languages.',\n suggestion: 'Use \"items\" with a union type (\"anyOf\") instead.',\n },\n not: {\n message: '\"not\" is not supported across all SDK languages.',\n suggestion: 'Express the constraint positively using \"enum\", \"oneOf\", or validation in application code.',\n },\n prefixItems: {\n message: '\"prefixItems\" (tuple validation) is not supported across all SDK languages.',\n suggestion: 'Use an \"object\" with named fields instead of a positional tuple.',\n },\n unevaluatedProperties: {\n message: '\"unevaluatedProperties\" is not supported across all SDK languages.',\n suggestion: 'Use \"additionalProperties\" instead.',\n },\n unevaluatedItems: {\n message: '\"unevaluatedItems\" is not supported across all SDK languages.',\n suggestion: 'Use \"items\" with a specific schema instead.',\n },\n};\n\n/** Formats supported across all four SDKs. */\nconst SUPPORTED_FORMATS = new Set(['email', 'uri', 'uuid', 'date-time', 'ipv4', 'ipv6']);\n\n/**\n * Validate that a JSON Schema uses only the cross-language-compatible subset.\n *\n * Walks the schema tree and reports unsupported keywords with actionable\n * error messages and suggestions for compatible alternatives.\n */\nexport function validateSmooaiSchema(schema: Record<string, unknown>): SchemaValidationResult {\n const errors: SchemaValidationError[] = [];\n walkSchema(schema, '', errors);\n return { valid: errors.length === 0, errors };\n}\n\nfunction walkSchema(node: unknown, path: string, errors: SchemaValidationError[]): void {\n if (typeof node !== 'object' || node === null || Array.isArray(node)) {\n return;\n }\n\n const obj = node as Record<string, unknown>;\n\n for (const key of Object.keys(obj)) {\n // Check for rejected keywords first (specific error messages)\n if (key in REJECTED_KEYWORDS) {\n const info = REJECTED_KEYWORDS[key];\n errors.push({\n path: path || '/',\n keyword: key,\n message: info.message,\n suggestion: info.suggestion,\n });\n continue;\n }\n\n // Skip known supported keywords — they're fine\n if (SUPPORTED_KEYWORDS.has(key)) {\n // Validate format values\n if (key === 'format' && typeof obj[key] === 'string' && !SUPPORTED_FORMATS.has(obj[key] as string)) {\n errors.push({\n path: path || '/',\n keyword: 'format',\n message: `Format \"${obj[key]}\" is not supported across all SDK languages.`,\n suggestion: `Supported formats: ${[...SUPPORTED_FORMATS].join(', ')}. Use \"pattern\" for custom string validation.`,\n });\n }\n continue;\n }\n\n // Unknown keywords that aren't standard JSON Schema — ignore\n // (could be vendor extensions like x-*, or $id, etc.)\n }\n\n // Recurse into sub-schemas\n if (obj.properties && typeof obj.properties === 'object') {\n const props = obj.properties as Record<string, unknown>;\n for (const [propName, propSchema] of Object.entries(props)) {\n walkSchema(propSchema, `${path}/properties/${propName}`, errors);\n }\n }\n\n if (obj.items && typeof obj.items === 'object') {\n walkSchema(obj.items, `${path}/items`, errors);\n }\n\n if (obj.additionalProperties && typeof obj.additionalProperties === 'object') {\n walkSchema(obj.additionalProperties, `${path}/additionalProperties`, errors);\n }\n\n // Composition keywords\n for (const compKey of ['anyOf', 'oneOf', 'allOf'] as const) {\n if (Array.isArray(obj[compKey])) {\n (obj[compKey] as unknown[]).forEach((subSchema, i) => {\n walkSchema(subSchema, `${path}/${compKey}/${i}`, errors);\n });\n }\n }\n\n // $defs / definitions\n for (const defsKey of ['$defs', 'definitions'] as const) {\n if (obj[defsKey] && typeof obj[defsKey] === 'object') {\n const defs = obj[defsKey] as Record<string, unknown>;\n for (const [defName, defSchema] of Object.entries(defs)) {\n walkSchema(defSchema, `${path}/${defsKey}/${defName}`, errors);\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import "../chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/schema-spec/smooai-config-schema-spec.ts
|
|
4
|
+
var SUPPORTED_KEYWORDS = /* @__PURE__ */ new Set([
|
|
5
|
+
// Core
|
|
6
|
+
"type",
|
|
7
|
+
"properties",
|
|
8
|
+
"required",
|
|
9
|
+
"enum",
|
|
10
|
+
"const",
|
|
11
|
+
"default",
|
|
12
|
+
// Metadata
|
|
13
|
+
"title",
|
|
14
|
+
"description",
|
|
15
|
+
"$schema",
|
|
16
|
+
// String
|
|
17
|
+
"minLength",
|
|
18
|
+
"maxLength",
|
|
19
|
+
"pattern",
|
|
20
|
+
"format",
|
|
21
|
+
// Numeric
|
|
22
|
+
"minimum",
|
|
23
|
+
"maximum",
|
|
24
|
+
"exclusiveMinimum",
|
|
25
|
+
"exclusiveMaximum",
|
|
26
|
+
"multipleOf",
|
|
27
|
+
// Array
|
|
28
|
+
"items",
|
|
29
|
+
"minItems",
|
|
30
|
+
"maxItems",
|
|
31
|
+
"uniqueItems",
|
|
32
|
+
// Object
|
|
33
|
+
"additionalProperties",
|
|
34
|
+
// Composition
|
|
35
|
+
"anyOf",
|
|
36
|
+
"oneOf",
|
|
37
|
+
"allOf",
|
|
38
|
+
// References
|
|
39
|
+
"$ref",
|
|
40
|
+
"$defs",
|
|
41
|
+
"definitions"
|
|
42
|
+
]);
|
|
43
|
+
var REJECTED_KEYWORDS = {
|
|
44
|
+
if: {
|
|
45
|
+
message: "Conditional schemas (if/then/else) are not supported across all SDK languages.",
|
|
46
|
+
suggestion: 'Use "oneOf" or "anyOf" with discriminator properties instead.'
|
|
47
|
+
},
|
|
48
|
+
then: {
|
|
49
|
+
message: "Conditional schemas (if/then/else) are not supported across all SDK languages.",
|
|
50
|
+
suggestion: 'Use "oneOf" or "anyOf" with discriminator properties instead.'
|
|
51
|
+
},
|
|
52
|
+
else: {
|
|
53
|
+
message: "Conditional schemas (if/then/else) are not supported across all SDK languages.",
|
|
54
|
+
suggestion: 'Use "oneOf" or "anyOf" with discriminator properties instead.'
|
|
55
|
+
},
|
|
56
|
+
patternProperties: {
|
|
57
|
+
message: '"patternProperties" is not supported across all SDK languages.',
|
|
58
|
+
suggestion: 'Use explicit "properties" with known key names, or "additionalProperties" with a type constraint.'
|
|
59
|
+
},
|
|
60
|
+
propertyNames: {
|
|
61
|
+
message: '"propertyNames" is not supported across all SDK languages.',
|
|
62
|
+
suggestion: "Validate property names in application code instead."
|
|
63
|
+
},
|
|
64
|
+
dependencies: {
|
|
65
|
+
message: '"dependencies" is not supported across all SDK languages.',
|
|
66
|
+
suggestion: 'Use "required" within "oneOf"/"anyOf" variants to express conditional requirements.'
|
|
67
|
+
},
|
|
68
|
+
contains: {
|
|
69
|
+
message: '"contains" is not supported across all SDK languages.',
|
|
70
|
+
suggestion: 'Use "items" with a union type ("anyOf") instead.'
|
|
71
|
+
},
|
|
72
|
+
not: {
|
|
73
|
+
message: '"not" is not supported across all SDK languages.',
|
|
74
|
+
suggestion: 'Express the constraint positively using "enum", "oneOf", or validation in application code.'
|
|
75
|
+
},
|
|
76
|
+
prefixItems: {
|
|
77
|
+
message: '"prefixItems" (tuple validation) is not supported across all SDK languages.',
|
|
78
|
+
suggestion: 'Use an "object" with named fields instead of a positional tuple.'
|
|
79
|
+
},
|
|
80
|
+
unevaluatedProperties: {
|
|
81
|
+
message: '"unevaluatedProperties" is not supported across all SDK languages.',
|
|
82
|
+
suggestion: 'Use "additionalProperties" instead.'
|
|
83
|
+
},
|
|
84
|
+
unevaluatedItems: {
|
|
85
|
+
message: '"unevaluatedItems" is not supported across all SDK languages.',
|
|
86
|
+
suggestion: 'Use "items" with a specific schema instead.'
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
var SUPPORTED_FORMATS = /* @__PURE__ */ new Set(["email", "uri", "uuid", "date-time", "ipv4", "ipv6"]);
|
|
90
|
+
function validateSmooaiSchema(schema) {
|
|
91
|
+
const errors = [];
|
|
92
|
+
walkSchema(schema, "", errors);
|
|
93
|
+
return { valid: errors.length === 0, errors };
|
|
94
|
+
}
|
|
95
|
+
function walkSchema(node, path, errors) {
|
|
96
|
+
if (typeof node !== "object" || node === null || Array.isArray(node)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const obj = node;
|
|
100
|
+
for (const key of Object.keys(obj)) {
|
|
101
|
+
if (key in REJECTED_KEYWORDS) {
|
|
102
|
+
const info = REJECTED_KEYWORDS[key];
|
|
103
|
+
errors.push({
|
|
104
|
+
path: path || "/",
|
|
105
|
+
keyword: key,
|
|
106
|
+
message: info.message,
|
|
107
|
+
suggestion: info.suggestion
|
|
108
|
+
});
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (SUPPORTED_KEYWORDS.has(key)) {
|
|
112
|
+
if (key === "format" && typeof obj[key] === "string" && !SUPPORTED_FORMATS.has(obj[key])) {
|
|
113
|
+
errors.push({
|
|
114
|
+
path: path || "/",
|
|
115
|
+
keyword: "format",
|
|
116
|
+
message: `Format "${obj[key]}" is not supported across all SDK languages.`,
|
|
117
|
+
suggestion: `Supported formats: ${[...SUPPORTED_FORMATS].join(", ")}. Use "pattern" for custom string validation.`
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (obj.properties && typeof obj.properties === "object") {
|
|
124
|
+
const props = obj.properties;
|
|
125
|
+
for (const [propName, propSchema] of Object.entries(props)) {
|
|
126
|
+
walkSchema(propSchema, `${path}/properties/${propName}`, errors);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (obj.items && typeof obj.items === "object") {
|
|
130
|
+
walkSchema(obj.items, `${path}/items`, errors);
|
|
131
|
+
}
|
|
132
|
+
if (obj.additionalProperties && typeof obj.additionalProperties === "object") {
|
|
133
|
+
walkSchema(obj.additionalProperties, `${path}/additionalProperties`, errors);
|
|
134
|
+
}
|
|
135
|
+
for (const compKey of ["anyOf", "oneOf", "allOf"]) {
|
|
136
|
+
if (Array.isArray(obj[compKey])) {
|
|
137
|
+
obj[compKey].forEach((subSchema, i) => {
|
|
138
|
+
walkSchema(subSchema, `${path}/${compKey}/${i}`, errors);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
for (const defsKey of ["$defs", "definitions"]) {
|
|
143
|
+
if (obj[defsKey] && typeof obj[defsKey] === "object") {
|
|
144
|
+
const defs = obj[defsKey];
|
|
145
|
+
for (const [defName, defSchema] of Object.entries(defs)) {
|
|
146
|
+
walkSchema(defSchema, `${path}/${defsKey}/${defName}`, errors);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export {
|
|
152
|
+
validateSmooaiSchema
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=smooai-config-schema-spec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/schema-spec/smooai-config-schema-spec.ts"],"sourcesContent":["/**\n * Cross-language JSON Schema validation for the Smoo AI config SDK.\n *\n * Validates that a JSON Schema uses only the subset of keywords that all\n * four language SDKs (TypeScript, Python, Rust, Go) can reliably support.\n */\n\nexport interface SchemaValidationError {\n path: string;\n keyword: string;\n message: string;\n suggestion: string;\n}\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: SchemaValidationError[];\n}\n\n/** Keywords supported across all four SDK languages. */\nconst SUPPORTED_KEYWORDS = new Set([\n // Core\n 'type',\n 'properties',\n 'required',\n 'enum',\n 'const',\n 'default',\n // Metadata\n 'title',\n 'description',\n '$schema',\n // String\n 'minLength',\n 'maxLength',\n 'pattern',\n 'format',\n // Numeric\n 'minimum',\n 'maximum',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'multipleOf',\n // Array\n 'items',\n 'minItems',\n 'maxItems',\n 'uniqueItems',\n // Object\n 'additionalProperties',\n // Composition\n 'anyOf',\n 'oneOf',\n 'allOf',\n // References\n '$ref',\n '$defs',\n 'definitions',\n]);\n\n/** Keywords explicitly rejected with actionable error messages. */\nconst REJECTED_KEYWORDS: Record<string, { message: string; suggestion: string }> = {\n if: {\n message: 'Conditional schemas (if/then/else) are not supported across all SDK languages.',\n suggestion: 'Use \"oneOf\" or \"anyOf\" with discriminator properties instead.',\n },\n then: {\n message: 'Conditional schemas (if/then/else) are not supported across all SDK languages.',\n suggestion: 'Use \"oneOf\" or \"anyOf\" with discriminator properties instead.',\n },\n else: {\n message: 'Conditional schemas (if/then/else) are not supported across all SDK languages.',\n suggestion: 'Use \"oneOf\" or \"anyOf\" with discriminator properties instead.',\n },\n patternProperties: {\n message: '\"patternProperties\" is not supported across all SDK languages.',\n suggestion: 'Use explicit \"properties\" with known key names, or \"additionalProperties\" with a type constraint.',\n },\n propertyNames: {\n message: '\"propertyNames\" is not supported across all SDK languages.',\n suggestion: 'Validate property names in application code instead.',\n },\n dependencies: {\n message: '\"dependencies\" is not supported across all SDK languages.',\n suggestion: 'Use \"required\" within \"oneOf\"/\"anyOf\" variants to express conditional requirements.',\n },\n contains: {\n message: '\"contains\" is not supported across all SDK languages.',\n suggestion: 'Use \"items\" with a union type (\"anyOf\") instead.',\n },\n not: {\n message: '\"not\" is not supported across all SDK languages.',\n suggestion: 'Express the constraint positively using \"enum\", \"oneOf\", or validation in application code.',\n },\n prefixItems: {\n message: '\"prefixItems\" (tuple validation) is not supported across all SDK languages.',\n suggestion: 'Use an \"object\" with named fields instead of a positional tuple.',\n },\n unevaluatedProperties: {\n message: '\"unevaluatedProperties\" is not supported across all SDK languages.',\n suggestion: 'Use \"additionalProperties\" instead.',\n },\n unevaluatedItems: {\n message: '\"unevaluatedItems\" is not supported across all SDK languages.',\n suggestion: 'Use \"items\" with a specific schema instead.',\n },\n};\n\n/** Formats supported across all four SDKs. */\nconst SUPPORTED_FORMATS = new Set(['email', 'uri', 'uuid', 'date-time', 'ipv4', 'ipv6']);\n\n/**\n * Validate that a JSON Schema uses only the cross-language-compatible subset.\n *\n * Walks the schema tree and reports unsupported keywords with actionable\n * error messages and suggestions for compatible alternatives.\n */\nexport function validateSmooaiSchema(schema: Record<string, unknown>): SchemaValidationResult {\n const errors: SchemaValidationError[] = [];\n walkSchema(schema, '', errors);\n return { valid: errors.length === 0, errors };\n}\n\nfunction walkSchema(node: unknown, path: string, errors: SchemaValidationError[]): void {\n if (typeof node !== 'object' || node === null || Array.isArray(node)) {\n return;\n }\n\n const obj = node as Record<string, unknown>;\n\n for (const key of Object.keys(obj)) {\n // Check for rejected keywords first (specific error messages)\n if (key in REJECTED_KEYWORDS) {\n const info = REJECTED_KEYWORDS[key];\n errors.push({\n path: path || '/',\n keyword: key,\n message: info.message,\n suggestion: info.suggestion,\n });\n continue;\n }\n\n // Skip known supported keywords — they're fine\n if (SUPPORTED_KEYWORDS.has(key)) {\n // Validate format values\n if (key === 'format' && typeof obj[key] === 'string' && !SUPPORTED_FORMATS.has(obj[key] as string)) {\n errors.push({\n path: path || '/',\n keyword: 'format',\n message: `Format \"${obj[key]}\" is not supported across all SDK languages.`,\n suggestion: `Supported formats: ${[...SUPPORTED_FORMATS].join(', ')}. Use \"pattern\" for custom string validation.`,\n });\n }\n continue;\n }\n\n // Unknown keywords that aren't standard JSON Schema — ignore\n // (could be vendor extensions like x-*, or $id, etc.)\n }\n\n // Recurse into sub-schemas\n if (obj.properties && typeof obj.properties === 'object') {\n const props = obj.properties as Record<string, unknown>;\n for (const [propName, propSchema] of Object.entries(props)) {\n walkSchema(propSchema, `${path}/properties/${propName}`, errors);\n }\n }\n\n if (obj.items && typeof obj.items === 'object') {\n walkSchema(obj.items, `${path}/items`, errors);\n }\n\n if (obj.additionalProperties && typeof obj.additionalProperties === 'object') {\n walkSchema(obj.additionalProperties, `${path}/additionalProperties`, errors);\n }\n\n // Composition keywords\n for (const compKey of ['anyOf', 'oneOf', 'allOf'] as const) {\n if (Array.isArray(obj[compKey])) {\n (obj[compKey] as unknown[]).forEach((subSchema, i) => {\n walkSchema(subSchema, `${path}/${compKey}/${i}`, errors);\n });\n }\n }\n\n // $defs / definitions\n for (const defsKey of ['$defs', 'definitions'] as const) {\n if (obj[defsKey] && typeof obj[defsKey] === 'object') {\n const defs = obj[defsKey] as Record<string, unknown>;\n for (const [defName, defSchema] of Object.entries(defs)) {\n walkSchema(defSchema, `${path}/${defsKey}/${defName}`, errors);\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a directory exists.
|
|
3
|
+
*/
|
|
4
|
+
declare function directoryExists(path: string): Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Import a file. - Used to help mock imports.
|
|
7
|
+
*/
|
|
8
|
+
declare function importFile(path: string, errorMessage?: string): Promise<any>;
|
|
9
|
+
|
|
10
|
+
export { directoryExists, importFile };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a directory exists.
|
|
3
|
+
*/
|
|
4
|
+
declare function directoryExists(path: string): Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Import a file. - Used to help mock imports.
|
|
7
|
+
*/
|
|
8
|
+
declare function importFile(path: string, errorMessage?: string): Promise<any>;
|
|
9
|
+
|
|
10
|
+
export { directoryExists, importFile };
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/utils/fs.ts
|
|
31
|
+
var fs_exports = {};
|
|
32
|
+
__export(fs_exports, {
|
|
33
|
+
directoryExists: () => directoryExists,
|
|
34
|
+
importFile: () => importFile
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(fs_exports);
|
|
37
|
+
var import_fs = require("fs");
|
|
38
|
+
var import_promises = require("fs/promises");
|
|
39
|
+
|
|
40
|
+
// src/utils/index.ts
|
|
41
|
+
var import_esm_utils = __toESM(require("esm-utils"));
|
|
42
|
+
var SmooaiConfigError = class extends Error {
|
|
43
|
+
constructor(message, options) {
|
|
44
|
+
super(`[Smooai Config] ${message}`, options);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// src/utils/fs.ts
|
|
49
|
+
async function directoryExists(path) {
|
|
50
|
+
try {
|
|
51
|
+
const stats = await (0, import_promises.stat)(path);
|
|
52
|
+
return stats.isDirectory();
|
|
53
|
+
} catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function importFile(path, errorMessage) {
|
|
58
|
+
try {
|
|
59
|
+
await (0, import_promises.access)(path, import_fs.constants.R_OK);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
throw new SmooaiConfigError(errorMessage ?? `Unable to read file ${path}`, { cause: e });
|
|
62
|
+
}
|
|
63
|
+
const imported = await import(path);
|
|
64
|
+
if (!imported.default) {
|
|
65
|
+
throw new SmooaiConfigError(`The config file ${path} must have a default export.`);
|
|
66
|
+
}
|
|
67
|
+
return imported.default;
|
|
68
|
+
}
|
|
69
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
70
|
+
0 && (module.exports = {
|
|
71
|
+
directoryExists,
|
|
72
|
+
importFile
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/fs.ts","../../src/utils/index.ts"],"sourcesContent":["import { constants } from 'fs';\nimport { stat, access } from 'fs/promises';\nimport { SmooaiConfigError } from '.';\n\n/**\n * Check if a directory exists.\n */\nexport async function directoryExists(path: string): Promise<boolean> {\n try {\n const stats = await stat(path);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Import a file. - Used to help mock imports.\n */\nexport async function importFile(path: string, errorMessage?: string) {\n try {\n await access(path, constants.R_OK);\n } catch (e) {\n throw new SmooaiConfigError(errorMessage ?? `Unable to read file ${path}`, { cause: e });\n }\n const imported = await import(path);\n\n if (!imported.default) {\n throw new SmooaiConfigError(`The config file ${path} must have a default export.`);\n }\n\n return imported.default;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any -- ok */\nimport createEsmUtils from 'esm-utils';\n\n/**\n * Initialize global __dirname and __filename if not already set.\n */\nexport function initEsmUtils() {\n if (!global.__dirname || !global.__filename) {\n const { __dirname, __filename } = import.meta.url\n ? createEsmUtils({ url: import.meta.url, resolve: import.meta.resolve } as any)\n : { __dirname: '', __filename: '' };\n global.__dirname = global.__dirname ? global.__dirname : __dirname;\n global.__filename = global.__filename ? global.__filename : __filename;\n }\n}\n\n/**\n * Check if an object is empty.\n */\nfunction isEmpty(obj: any): boolean {\n for (const prop in obj) {\n if (Object.hasOwn(obj, prop)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get the environment variables. Works in Node and Various React Runtimes.\n */\nexport const envToUse = (): NodeJS.ProcessEnv => (!isEmpty(process?.env) ? process.env : (import.meta as unknown as { env: NodeJS.ProcessEnv }).env);\n\n/**\n * Minimal utility to detect an object (excludes arrays).\n */\nexport function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n return !!obj && typeof obj === 'object' && !Array.isArray(obj);\n}\n\nexport class SmooaiConfigError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(`[Smooai Config] ${message}`, options);\n }\n}\n\n// ——— helper: single-char step, always recursing into SnakeCase<> ———\ntype _SnakeCaseChar<S extends string> = S extends `${infer First}${infer Rest}`\n ? First extends '_' | ' '\n ? SnakeCase<Rest> // drop \"_\" or \" \"\n : Rest extends Uncapitalize<Rest>\n ? `${Lowercase<First>}${SnakeCase<Rest>}` // next is lower/non-letter → no underscore\n : First extends Lowercase<First>\n ? `${Lowercase<First>}_${SnakeCase<Rest>}` // lower→upper → underscore\n : `${Lowercase<First>}${SnakeCase<Rest>}` // upper→upper → no underscore\n : S; // empty or single character\n\n// ——— your public SnakeCase<> with 3-char look-ahead for acronyms ———\nexport type SnakeCase<S extends string> =\n // 1⃣ Acronym boundary: Upper + Upper + lower (e.g. \"IKey\" → \"i_key\")\n S extends `${infer A}${infer B}${infer C}${infer Rest}`\n ? A extends Uppercase<A>\n ? B extends Uppercase<B>\n ? C extends Lowercase<C>\n ? `${Lowercase<A>}_${SnakeCase<`${B}${C}${Rest}`>}`\n : _SnakeCaseChar<S>\n : _SnakeCaseChar<S>\n : _SnakeCaseChar<S>\n : // 2⃣ If we don’t even have 3 chars to peek, fall back to the single-char step\n _SnakeCaseChar<S>;\n\nexport type UpperSnakeCase<S extends string> =\n S extends Uppercase<S>\n ? S extends `${string} ${string}`\n ? // if it had a space, rerun SnakeCase to turn that into \" \"\n Uppercase<SnakeCase<S>>\n : S\n : Uppercase<SnakeCase<S>>;\n\nexport type UnionToUpperSnake<U> = U extends string ? UpperSnakeCase<U> : never;\n\n/**\n * One-pass, no-regex UPPER_SNAKE_CASE converter.\n * - Early exit if already UPPER_SNAKE_CASE.\n * - Drops spaces/underscores.\n * - Splits on lower→Upper and Acronym→Word\n */\nexport function snakecase(input: string): string {\n // Early return if it’s already UPPER_SNAKE_CASE\n if (/^[A-Z0-9]+(?:_[A-Z0-9]+)*$/.test(input)) {\n return input;\n }\n\n let out = '';\n const len = input.length;\n\n for (let i = 0; i < len; i++) {\n const ch = input[i];\n if (ch === '_' || ch === ' ') continue; // drop underscores/spaces\n\n const code = input.charCodeAt(i);\n const isUpper = code >= 65 && code <= 90; // A–Z\n const isLower = code >= 97 && code <= 122; // a–z\n const isDigit = code >= 48 && code <= 57; // 0–9\n\n if (isUpper) {\n // split on lower→upper or acronym→word\n if (i > 0) {\n const prev = input.charCodeAt(i - 1);\n const prevIsLower = prev >= 97 && prev <= 122;\n const next = i + 1 < len ? input.charCodeAt(i + 1) : NaN;\n const nextIsLower = next >= 97 && next <= 122;\n if (prevIsLower || nextIsLower) {\n out += '_';\n }\n }\n out += ch; // keep uppercase\n } else if (isLower) {\n // lowercase → uppercase\n out += String.fromCharCode(code - 32);\n } else if (isDigit) {\n // digit → append as-is\n out += ch;\n } else {\n // any other character: append or drop as you see fit\n out += ch;\n }\n }\n\n return out;\n}\n\nexport function convertKeyToUpperSnakeCase(key: string): string {\n return snakecase(key).toUpperCase();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAA0B;AAC1B,sBAA6B;;;ACA7B,uBAA2B;AAuCpB,IAAM,oBAAN,cAAgC,MAAM;AAAA,EACzC,YAAY,SAAiB,SAAwB;AACjD,UAAM,mBAAmB,OAAO,IAAI,OAAO;AAAA,EAC/C;AACJ;;;ADrCA,eAAsB,gBAAgB,MAAgC;AAClE,MAAI;AACA,UAAM,QAAQ,UAAM,sBAAK,IAAI;AAC7B,WAAO,MAAM,YAAY;AAAA,EAC7B,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAKA,eAAsB,WAAW,MAAc,cAAuB;AAClE,MAAI;AACA,cAAM,wBAAO,MAAM,oBAAU,IAAI;AAAA,EACrC,SAAS,GAAG;AACR,UAAM,IAAI,kBAAkB,gBAAgB,uBAAuB,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,EAC3F;AACA,QAAM,WAAW,MAAM,OAAO;AAE9B,MAAI,CAAC,SAAS,SAAS;AACnB,UAAM,IAAI,kBAAkB,mBAAmB,IAAI,8BAA8B;AAAA,EACrF;AAEA,SAAO,SAAS;AACpB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize global __dirname and __filename if not already set.
|
|
3
|
+
*/
|
|
4
|
+
declare function initEsmUtils(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Get the environment variables. Works in Node and Various React Runtimes.
|
|
7
|
+
*/
|
|
8
|
+
declare const envToUse: () => NodeJS.ProcessEnv;
|
|
9
|
+
/**
|
|
10
|
+
* Minimal utility to detect an object (excludes arrays).
|
|
11
|
+
*/
|
|
12
|
+
declare function isPlainObject(obj: unknown): obj is Record<string, unknown>;
|
|
13
|
+
declare class SmooaiConfigError extends Error {
|
|
14
|
+
constructor(message: string, options?: ErrorOptions);
|
|
15
|
+
}
|
|
16
|
+
type _SnakeCaseChar<S extends string> = S extends `${infer First}${infer Rest}` ? First extends '_' | ' ' ? SnakeCase<Rest> : Rest extends Uncapitalize<Rest> ? `${Lowercase<First>}${SnakeCase<Rest>}` : First extends Lowercase<First> ? `${Lowercase<First>}_${SnakeCase<Rest>}` : `${Lowercase<First>}${SnakeCase<Rest>}` : S;
|
|
17
|
+
type SnakeCase<S extends string> = S extends `${infer A}${infer B}${infer C}${infer Rest}` ? A extends Uppercase<A> ? B extends Uppercase<B> ? C extends Lowercase<C> ? `${Lowercase<A>}_${SnakeCase<`${B}${C}${Rest}`>}` : _SnakeCaseChar<S> : _SnakeCaseChar<S> : _SnakeCaseChar<S> : _SnakeCaseChar<S>;
|
|
18
|
+
type UpperSnakeCase<S extends string> = S extends Uppercase<S> ? S extends `${string} ${string}` ? Uppercase<SnakeCase<S>> : S : Uppercase<SnakeCase<S>>;
|
|
19
|
+
type UnionToUpperSnake<U> = U extends string ? UpperSnakeCase<U> : never;
|
|
20
|
+
/**
|
|
21
|
+
* One-pass, no-regex UPPER_SNAKE_CASE converter.
|
|
22
|
+
* - Early exit if already UPPER_SNAKE_CASE.
|
|
23
|
+
* - Drops spaces/underscores.
|
|
24
|
+
* - Splits on lower→Upper and Acronym→Word
|
|
25
|
+
*/
|
|
26
|
+
declare function snakecase(input: string): string;
|
|
27
|
+
declare function convertKeyToUpperSnakeCase(key: string): string;
|
|
28
|
+
|
|
29
|
+
export { SmooaiConfigError, type SnakeCase, type UnionToUpperSnake, type UpperSnakeCase, convertKeyToUpperSnakeCase, envToUse, initEsmUtils, isPlainObject, snakecase };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initialize global __dirname and __filename if not already set.
|
|
3
|
+
*/
|
|
4
|
+
declare function initEsmUtils(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Get the environment variables. Works in Node and Various React Runtimes.
|
|
7
|
+
*/
|
|
8
|
+
declare const envToUse: () => NodeJS.ProcessEnv;
|
|
9
|
+
/**
|
|
10
|
+
* Minimal utility to detect an object (excludes arrays).
|
|
11
|
+
*/
|
|
12
|
+
declare function isPlainObject(obj: unknown): obj is Record<string, unknown>;
|
|
13
|
+
declare class SmooaiConfigError extends Error {
|
|
14
|
+
constructor(message: string, options?: ErrorOptions);
|
|
15
|
+
}
|
|
16
|
+
type _SnakeCaseChar<S extends string> = S extends `${infer First}${infer Rest}` ? First extends '_' | ' ' ? SnakeCase<Rest> : Rest extends Uncapitalize<Rest> ? `${Lowercase<First>}${SnakeCase<Rest>}` : First extends Lowercase<First> ? `${Lowercase<First>}_${SnakeCase<Rest>}` : `${Lowercase<First>}${SnakeCase<Rest>}` : S;
|
|
17
|
+
type SnakeCase<S extends string> = S extends `${infer A}${infer B}${infer C}${infer Rest}` ? A extends Uppercase<A> ? B extends Uppercase<B> ? C extends Lowercase<C> ? `${Lowercase<A>}_${SnakeCase<`${B}${C}${Rest}`>}` : _SnakeCaseChar<S> : _SnakeCaseChar<S> : _SnakeCaseChar<S> : _SnakeCaseChar<S>;
|
|
18
|
+
type UpperSnakeCase<S extends string> = S extends Uppercase<S> ? S extends `${string} ${string}` ? Uppercase<SnakeCase<S>> : S : Uppercase<SnakeCase<S>>;
|
|
19
|
+
type UnionToUpperSnake<U> = U extends string ? UpperSnakeCase<U> : never;
|
|
20
|
+
/**
|
|
21
|
+
* One-pass, no-regex UPPER_SNAKE_CASE converter.
|
|
22
|
+
* - Early exit if already UPPER_SNAKE_CASE.
|
|
23
|
+
* - Drops spaces/underscores.
|
|
24
|
+
* - Splits on lower→Upper and Acronym→Word
|
|
25
|
+
*/
|
|
26
|
+
declare function snakecase(input: string): string;
|
|
27
|
+
declare function convertKeyToUpperSnakeCase(key: string): string;
|
|
28
|
+
|
|
29
|
+
export { SmooaiConfigError, type SnakeCase, type UnionToUpperSnake, type UpperSnakeCase, convertKeyToUpperSnakeCase, envToUse, initEsmUtils, isPlainObject, snakecase };
|