@neocompose/cli 0.34.0 → 0.34.1
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
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.34.1] - 2026-08-19
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Accept the advertised positional `NeoLookupVariantFolder<TObject, TValue>`
|
|
8
|
+
constructor form and lower it identically to named `path`, `collection`, and
|
|
9
|
+
`collectionValue` arguments.
|
|
10
|
+
- Preserve lookup-variant member `TValue` through the CLI/server document
|
|
11
|
+
boundary under the canonical `valueTypeInfo` field, including an open generic
|
|
12
|
+
parameter authored by an enclosing class.
|
|
13
|
+
- Give `neo test` the candidate project's variants and variant folders, so
|
|
14
|
+
variants declared in the same pending push resolve alongside root values and
|
|
15
|
+
declared list indexes.
|
|
16
|
+
|
|
3
17
|
## [0.34.0] - 2026-08-19
|
|
4
18
|
|
|
5
19
|
### Added
|
package/dist/neo.mjs
CHANGED
|
@@ -18762,7 +18762,7 @@ var init_project_schema_contract_generated = __esm({
|
|
|
18762
18762
|
"../packages/neoscript-language/src/project-schema-contract.generated.ts"() {
|
|
18763
18763
|
"use strict";
|
|
18764
18764
|
PROJECT_SCHEMA_MANIFEST_FORMAT_VERSION = 3;
|
|
18765
|
-
PROJECT_SCHEMA_MANIFEST_CONTRACT_VERSION = "3.
|
|
18765
|
+
PROJECT_SCHEMA_MANIFEST_CONTRACT_VERSION = "3.14";
|
|
18766
18766
|
PROJECT_FILE_UPLOAD_BATCH_SIZE = 32;
|
|
18767
18767
|
NEO_PROJECT_SOURCE_RECORD_CONTRACT = {
|
|
18768
18768
|
"recordFields": {
|
|
@@ -18804,7 +18804,7 @@ var init_project_schema_contract_generated = __esm({
|
|
|
18804
18804
|
"collectionValueId",
|
|
18805
18805
|
"declaredTypeInfo",
|
|
18806
18806
|
"targetTypeInfo",
|
|
18807
|
-
"
|
|
18807
|
+
"valueTypeInfo",
|
|
18808
18808
|
"dialogueGroupId",
|
|
18809
18809
|
"code",
|
|
18810
18810
|
"setterCode",
|
|
@@ -20934,10 +20934,20 @@ var init_project_source_construction_diagnostics = __esm({
|
|
|
20934
20934
|
});
|
|
20935
20935
|
|
|
20936
20936
|
// ../packages/neoscript-language/src/project-source-variants.ts
|
|
20937
|
+
function neoLookupVariantFolderArgument(expression, name) {
|
|
20938
|
+
const index = expression.args.findIndex((_, argumentIndex) => {
|
|
20939
|
+
const authoredName = expression.argumentNames?.[argumentIndex];
|
|
20940
|
+
return (authoredName ?? NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS[argumentIndex]?.name ?? null) === name;
|
|
20941
|
+
});
|
|
20942
|
+
return index < 0 ? void 0 : expression.args[index];
|
|
20943
|
+
}
|
|
20937
20944
|
function neoVariantConstructionSiteCall(className, argumentNames, initializerNames) {
|
|
20938
20945
|
if (className === NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME) {
|
|
20946
|
+
const logicalNames = argumentNames.map(
|
|
20947
|
+
(name, index) => name ?? NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS[index]?.name ?? null
|
|
20948
|
+
);
|
|
20939
20949
|
return {
|
|
20940
|
-
argumentNames:
|
|
20950
|
+
argumentNames: logicalNames.filter(
|
|
20941
20951
|
(name) => name !== "collection" && name !== "collectionValue"
|
|
20942
20952
|
),
|
|
20943
20953
|
initializerNames
|
|
@@ -21001,21 +21011,14 @@ function neoVariantFolderAnnotationSymbol(annotations) {
|
|
|
21001
21011
|
function folderPath(declaration) {
|
|
21002
21012
|
const expression = parseInitializer(declaration);
|
|
21003
21013
|
if (expression === null || expression.kind !== "new") return null;
|
|
21004
|
-
const
|
|
21005
|
-
(name) => name === "path"
|
|
21006
|
-
);
|
|
21007
|
-
const argument2 = expression.args[pathIndex !== void 0 && pathIndex >= 0 ? pathIndex : 0];
|
|
21014
|
+
const argument2 = neoLookupVariantFolderArgument(expression, "path");
|
|
21008
21015
|
if (argument2 === void 0 || argument2.kind !== "litString") return null;
|
|
21009
21016
|
return argument2.value;
|
|
21010
21017
|
}
|
|
21011
21018
|
function folderCollectionPath(declaration) {
|
|
21012
21019
|
const expression = parseInitializer(declaration);
|
|
21013
21020
|
if (expression === null || expression.kind !== "new") return null;
|
|
21014
|
-
const
|
|
21015
|
-
(name) => name === "collection"
|
|
21016
|
-
);
|
|
21017
|
-
if (index === void 0 || index < 0) return null;
|
|
21018
|
-
const argument2 = expression.args[index];
|
|
21021
|
+
const argument2 = neoLookupVariantFolderArgument(expression, "collection");
|
|
21019
21022
|
if (argument2 === void 0) return null;
|
|
21020
21023
|
const parts = [];
|
|
21021
21024
|
let cursor = argument2;
|
|
@@ -21746,7 +21749,7 @@ function variantDiagnostic(entry, range2, code, message) {
|
|
|
21746
21749
|
message
|
|
21747
21750
|
};
|
|
21748
21751
|
}
|
|
21749
|
-
var NEO_VARIANT_CONSTRUCTOR_ARGUMENTS, NEO_VARIANT_MEMBER_ARGUMENTS, dottedScope;
|
|
21752
|
+
var NEO_VARIANT_CONSTRUCTOR_ARGUMENTS, NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS, NEO_VARIANT_MEMBER_ARGUMENTS, dottedScope;
|
|
21750
21753
|
var init_project_source_variants = __esm({
|
|
21751
21754
|
"../packages/neoscript-language/src/project-source-variants.ts"() {
|
|
21752
21755
|
"use strict";
|
|
@@ -21760,6 +21763,11 @@ var init_project_source_variants = __esm({
|
|
|
21760
21763
|
"overrides",
|
|
21761
21764
|
"childOverrides"
|
|
21762
21765
|
];
|
|
21766
|
+
NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS = [
|
|
21767
|
+
{ name: "path", type: "string" },
|
|
21768
|
+
{ name: "collection", type: "List<TValue>" },
|
|
21769
|
+
{ name: "collectionValue", type: "Reference<List<TValue>>" }
|
|
21770
|
+
];
|
|
21763
21771
|
NEO_VARIANT_MEMBER_ARGUMENTS = /* @__PURE__ */ new Map([
|
|
21764
21772
|
["overrides", "Overrides"],
|
|
21765
21773
|
["childOverrides", "ChildOverrides"]
|
|
@@ -23847,7 +23855,8 @@ function validateExpression(expression, expected, scope, environment, uri, range
|
|
|
23847
23855
|
) ?? [];
|
|
23848
23856
|
const overload = declaration && declaration.constructors.length > 0 ? matchingDeclaredConstructor(declaration, expression.argumentNames) : null;
|
|
23849
23857
|
expression.args.forEach((argument2, index) => {
|
|
23850
|
-
const
|
|
23858
|
+
const authoredName = expression.argumentNames?.[index];
|
|
23859
|
+
const named = declaration.name === NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME ? authoredName ?? NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS[index]?.name : authoredName;
|
|
23851
23860
|
if (declaration.name === NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME && named === "collection") {
|
|
23852
23861
|
return;
|
|
23853
23862
|
}
|
|
@@ -29003,11 +29012,7 @@ function projectConstructorArgumentCompletions(analysis, document, position) {
|
|
|
29003
29012
|
}
|
|
29004
29013
|
function lookupVariantFolderArgumentFields(typeName) {
|
|
29005
29014
|
if (typeName !== NEO_LOOKUP_VARIANT_FOLDER_TYPE_NAME) return null;
|
|
29006
|
-
return
|
|
29007
|
-
{ name: "path", type: "string" },
|
|
29008
|
-
{ name: "collection", type: "List<TValue>" },
|
|
29009
|
-
{ name: "collectionValue", type: "Reference<List<TValue>>" }
|
|
29010
|
-
];
|
|
29015
|
+
return NEO_LOOKUP_VARIANT_FOLDER_CONSTRUCTOR_ARGUMENTS;
|
|
29011
29016
|
}
|
|
29012
29017
|
function declaredConstructorNamedArguments(analysis, typeName, used) {
|
|
29013
29018
|
const contract = classConstructionContract(
|
|
@@ -34866,7 +34871,7 @@ var init_document_contracts = __esm({
|
|
|
34866
34871
|
"collectionValueId",
|
|
34867
34872
|
"declaredTypeInfo",
|
|
34868
34873
|
"targetTypeInfo",
|
|
34869
|
-
"
|
|
34874
|
+
"valueTypeInfo",
|
|
34870
34875
|
"dialogueGroupId",
|
|
34871
34876
|
"code",
|
|
34872
34877
|
"setterCode",
|
|
@@ -34905,6 +34910,7 @@ var init_document_contracts = __esm({
|
|
|
34905
34910
|
collectionValueId: "missingIsNullOnFullMember",
|
|
34906
34911
|
declaredTypeInfo: "nullIsAbsent",
|
|
34907
34912
|
targetTypeInfo: "nullIsAbsent",
|
|
34913
|
+
valueTypeInfo: "nullIsAbsent",
|
|
34908
34914
|
dialogueGroupId: "missingIsNullOnFullMember",
|
|
34909
34915
|
templateId: "missingIsNullOnFullMember",
|
|
34910
34916
|
setterCode: "nullIsAbsent",
|
|
@@ -36335,10 +36341,10 @@ function memberFromDocument(record3, members, owners, classNames, context) {
|
|
|
36335
36341
|
record3,
|
|
36336
36342
|
"targetTypeInfo"
|
|
36337
36343
|
),
|
|
36338
|
-
valueType: field("
|
|
36339
|
-
field("
|
|
36344
|
+
valueType: field("valueTypeInfo", null) === null ? null : documentTypeToManifest(
|
|
36345
|
+
field("valueTypeInfo", void 0),
|
|
36340
36346
|
record3,
|
|
36341
|
-
"
|
|
36347
|
+
"valueTypeInfo"
|
|
36342
36348
|
)
|
|
36343
36349
|
};
|
|
36344
36350
|
}
|
|
@@ -36488,7 +36494,7 @@ function memberToDocumentFields(member, baseData3) {
|
|
|
36488
36494
|
}
|
|
36489
36495
|
if (member.kind === "variant") {
|
|
36490
36496
|
fields.targetTypeInfo = manifestTypeToDocument(member.targetType);
|
|
36491
|
-
fields.
|
|
36497
|
+
fields.valueTypeInfo = member.valueType === null ? null : manifestTypeToDocument(member.valueType);
|
|
36492
36498
|
}
|
|
36493
36499
|
if (member.kind === "generic") {
|
|
36494
36500
|
fields.genericParamId = member.genericParamId;
|
|
@@ -39692,10 +39698,10 @@ function assertMember2(value, path) {
|
|
|
39692
39698
|
member.valueType,
|
|
39693
39699
|
`${path}.valueType`
|
|
39694
39700
|
).kind;
|
|
39695
|
-
if (valueKind !== "class") {
|
|
39701
|
+
if (valueKind !== "class" && valueKind !== "generic") {
|
|
39696
39702
|
invalid(
|
|
39697
39703
|
`${path}.valueType.kind`,
|
|
39698
|
-
"a lookup variant member's TValue must be a collection entry class."
|
|
39704
|
+
"a lookup variant member's TValue must be a collection entry class or an open generic parameter."
|
|
39699
39705
|
);
|
|
39700
39706
|
}
|
|
39701
39707
|
}
|
|
@@ -44154,6 +44160,11 @@ function isMemberVariantBase(value) {
|
|
|
44154
44160
|
if (v.targetTypeInfo.type !== 7 /* Class */ && v.targetTypeInfo.type !== 21 /* Generic */) {
|
|
44155
44161
|
return false;
|
|
44156
44162
|
}
|
|
44163
|
+
if (v.valueTypeInfo !== void 0 && v.valueTypeInfo !== null && (!isNSTypeInfo(v.valueTypeInfo) || // P68's concrete folder binding resolves to a Class, while an unclosed
|
|
44164
|
+
// owner class can still spell the same TValue as its Generic parameter.
|
|
44165
|
+
v.valueTypeInfo.type !== 7 /* Class */ && v.valueTypeInfo.type !== 21 /* Generic */)) {
|
|
44166
|
+
return false;
|
|
44167
|
+
}
|
|
44157
44168
|
const defaultValue = v.defaultValue;
|
|
44158
44169
|
if (defaultValue === void 0 || defaultValue === null) return true;
|
|
44159
44170
|
if (!isMemberValueBase(defaultValue)) return false;
|
|
@@ -60262,13 +60273,11 @@ function folderBinding(context, global) {
|
|
|
60262
60273
|
`Lookup variant folder ${global.name} must be declared with new(...).`
|
|
60263
60274
|
);
|
|
60264
60275
|
}
|
|
60265
|
-
const
|
|
60266
|
-
|
|
60267
|
-
|
|
60268
|
-
|
|
60269
|
-
|
|
60270
|
-
const collection = named.get("collection");
|
|
60271
|
-
const collectionValue = named.get("collectionValue");
|
|
60276
|
+
const collection = neoLookupVariantFolderArgument(expression, "collection");
|
|
60277
|
+
const collectionValue = neoLookupVariantFolderArgument(
|
|
60278
|
+
expression,
|
|
60279
|
+
"collectionValue"
|
|
60280
|
+
);
|
|
60272
60281
|
const collectionPath = collection === void 0 ? null : dottedPath(collection);
|
|
60273
60282
|
if (collectionPath === null) {
|
|
60274
60283
|
throw new Error(
|
|
@@ -113164,8 +113173,8 @@ var init_registry2 = __esm({
|
|
|
113164
113173
|
"use strict";
|
|
113165
113174
|
PROJECT_SCHEMA_CONTRACT = Object.freeze({
|
|
113166
113175
|
formatVersion: 3,
|
|
113167
|
-
contractVersion: "3.
|
|
113168
|
-
cliVersion: "0.34.
|
|
113176
|
+
contractVersion: "3.14",
|
|
113177
|
+
cliVersion: "0.34.1",
|
|
113169
113178
|
projectFileUploadBatchSize: 32,
|
|
113170
113179
|
documentRecords: {
|
|
113171
113180
|
member: {
|
|
@@ -113207,7 +113216,7 @@ var init_registry2 = __esm({
|
|
|
113207
113216
|
"collectionValueId",
|
|
113208
113217
|
"declaredTypeInfo",
|
|
113209
113218
|
"targetTypeInfo",
|
|
113210
|
-
"
|
|
113219
|
+
"valueTypeInfo",
|
|
113211
113220
|
"dialogueGroupId",
|
|
113212
113221
|
"code",
|
|
113213
113222
|
"setterCode",
|
|
@@ -113246,6 +113255,7 @@ var init_registry2 = __esm({
|
|
|
113246
113255
|
collectionValueId: "missingIsNullOnFullMember",
|
|
113247
113256
|
declaredTypeInfo: "nullIsAbsent",
|
|
113248
113257
|
targetTypeInfo: "nullIsAbsent",
|
|
113258
|
+
valueTypeInfo: "nullIsAbsent",
|
|
113249
113259
|
dialogueGroupId: "missingIsNullOnFullMember",
|
|
113250
113260
|
templateId: "missingIsNullOnFullMember",
|
|
113251
113261
|
setterCode: "nullIsAbsent",
|
|
@@ -114652,6 +114662,8 @@ function sharedEvaluatorBase(rawDocument) {
|
|
|
114652
114662
|
enums: document.enums,
|
|
114653
114663
|
interfaces: document.interfaces,
|
|
114654
114664
|
constructors,
|
|
114665
|
+
variants: document.variants,
|
|
114666
|
+
variantFolders: document.variantFolders,
|
|
114655
114667
|
projectFiles: document.projectFiles,
|
|
114656
114668
|
localizationConfig: document.localizationConfig,
|
|
114657
114669
|
localizedTexts: document.localizedTexts,
|
|
@@ -119764,7 +119776,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
|
|
|
119764
119776
|
async function main() {
|
|
119765
119777
|
const args = parseArgs(process.argv.slice(2));
|
|
119766
119778
|
if (args.command === "--version") {
|
|
119767
|
-
console.log("0.34.
|
|
119779
|
+
console.log("0.34.1");
|
|
119768
119780
|
return;
|
|
119769
119781
|
}
|
|
119770
119782
|
if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {
|
package/package.json
CHANGED
|
@@ -83,7 +83,7 @@ wrappers.
|
|
|
83
83
|
The marker near the top of `SKILL.md` must exactly match the package version:
|
|
84
84
|
|
|
85
85
|
```html
|
|
86
|
-
<!-- reviewed-through-cli: 0.34.
|
|
86
|
+
<!-- reviewed-through-cli: 0.34.1 -->
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
The quoted version above is checked too, so this instruction cannot go stale
|