Skip to content

Lint complains of redefinition when re-using term with context #563

Open
@absoludity

Description

@absoludity

Simplest reproducible example (it may have other errors after simplifying): AShape defines the position term (which in turn defines the x and y terms). CBox tries to re-use the position term without any modification:

{
  "type": ["VerifiableCredential"],
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "shapes": "https://example.com/imaginary/shapes/",
      "@protected": true,
      "@version": 1.1,
      "AShape": {
        "@protected": true,
        "@id": "shapes:Shape",
        "@context": {
          "position": {
            "@protected": true,
            "@id": "shapes:position",
            "@context": {
              "x": "xsd:string",
              "y": "xsd:string"
            }
          }
        }
      },
      "CBox": {
        "@protected": true,
        "@id": "shapes:Box",
        "@context": {
          "position": "shapes:position"
        }
      }
    }
  ],
  "credentialSubject": {
    "type": ["CBox", "AShape"]
  }
}

If the type is both ["CBox", "AShape"] as it is for the credentialSubject property above, then lint complains with the following:

$ jsonld lint -l test-file.jsonld 
jsonld.SyntaxError: Invalid JSON-LD syntax; tried to redefine a protected term.
    at api.createTermDefinition (/home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/node_modules/jsonld/lib/context.js:988:13)
    at api.process (/home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/node_modules/jsonld/lib/context.js:399:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async api.expand (/home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/node_modules/jsonld/lib/expand.js:238:23)
    at async _expandObject (/home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/node_modules/jsonld/lib/expand.js:926:25)
    at async api.expand (/home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/node_modules/jsonld/lib/expand.js:251:3)
    at async jsonld.expand (/home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/node_modules/jsonld/lib/jsonld.js:322:18)
    at async Command.lint (file:///home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/bin/jsonld.js:304:5)
    at async Command.parseAsync (/home/michael/.nvm/versions/node/v20.13.1/lib/node_modules/jsonld-cli/node_modules/commander/lib/command.js:936:5)
Error: {
  name: 'jsonld.SyntaxError',
  details: {
    code: 'protected term redefinition',
    context: { position: 'shapes:position' },
    term: 'position'
  }
}

When debugging, I can see it's failing when comparing the properties of the two terms which should be equal, but instead, it finds the lengths different at:

jsonld.js/lib/context.js

Lines 1589 to 1591 in 7165607

if(k1s.length !== k2s.length) {
return false;
}

If I print the two terms there with

    console.log(`not equal: ${JSON.stringify(x1)} and ${JSON.stringify(x2)}`);

I see that the two differ because one has an @context key, the other doesn't:

not equal: {"reverse":false,"_termHasColon":false,"@id":"https://example.com/imaginary/shapes/position","_prefix":false,"protected":true,"@context":{"x":"xsd:string","y":"xsd:string"}} and {"reverse":false,"_termHasColon":false,"@id":"https://example.com/imaginary/shapes/position","_prefix":false,"protected":true}

which looks like the context isn't included when aliasing (or shouldn't be included in the comparison - not sure which).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions