diff --git a/Makefile b/Makefile index 6444aca683..925e1ce902 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ build-api-reference: cd website && poetry run ./build_api_reference.sh build-docs: - cd website && corepack enable && yarn && yarn build + cd website && corepack enable && yarn && poetry run yarn build run-docs: build-api-reference - cd website && corepack enable && yarn && yarn start + cd website && corepack enable && yarn && poetry run yarn start diff --git a/website/build_api_reference.sh b/website/build_api_reference.sh index 564b458958..134fd6c235 100755 --- a/website/build_api_reference.sh +++ b/website/build_api_reference.sh @@ -1,12 +1,4 @@ #!/bin/bash -# Create docspec dump of this package's source code through pydoc-markdown -python ./pydoc-markdown/generate_ast.py > docspec-dump.jsonl - -rm -rf "${apify_shared_tempdir}" - # Generate import shortcuts from the modules python generate_module_shortcuts.py - -# Transform the docpec dumps into Typedoc-compatible docs tree -node transformDocs.js diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 80ea212e09..5128b0faa7 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,6 +1,27 @@ -/* eslint-disable global-require,import/no-extraneous-dependencies */ +/* eslint-disable global-require */ +const path = require('path'); + const { externalLinkProcessor } = require('./tools/utils/externalLink'); -const { groupSort } = require('./transformDocs'); + +const GROUP_ORDER = [ + 'Classes', + 'Abstract classes', + 'Data structures', + 'Errors', + 'Functions', + 'Constructors', + 'Methods', + 'Properties', + 'Constants', + 'Enumeration Members', +]; + +const groupSort = (g1, g2) => { + if (GROUP_ORDER.includes(g1) && GROUP_ORDER.includes(g2)) { + return GROUP_ORDER.indexOf(g1) - GROUP_ORDER.indexOf(g2); + } + return g1.localeCompare(g2); +}; /** @type {Partial} */ module.exports = { @@ -14,6 +35,7 @@ module.exports = { '/python/js/custom.js', '/crawlee-python/js/custom.js', ], + githubHost: 'github.com', headTags: [ // Intercom messenger { @@ -78,9 +100,11 @@ module.exports = { excludeExternals: false, }, sortSidebar: groupSort, - pathToCurrentVersionTypedocJSON: `${__dirname}/api-typedoc-generated.json`, routeBasePath: 'api', - python: true, + pythonOptions: { + pythonModulePath: path.join(__dirname, '../src/crawlee'), + moduleShortcutsPath: path.join(__dirname, 'module_shortcuts.json'), + }, }, ], // [ diff --git a/website/package.json b/website/package.json index f7fec54672..2a70f48e72 100644 --- a/website/package.json +++ b/website/package.json @@ -34,7 +34,7 @@ "typescript": "5.6.3" }, "dependencies": { - "@apify/docusaurus-plugin-typedoc-api": "^4.2.7", + "@apify/docusaurus-plugin-typedoc-api": "^4.3.0", "@apify/utilities": "^2.8.0", "@docusaurus/core": "^3.5.2", "@docusaurus/mdx-loader": "^3.5.2", diff --git a/website/parse_types.py b/website/parse_types.py deleted file mode 100644 index e7e547ac4b..0000000000 --- a/website/parse_types.py +++ /dev/null @@ -1,82 +0,0 @@ -""" -Given a JSON file containing a list of expressions, this script will parse each expression and output a JSON file containing an object with the parsed expressions. -Called from transformDocs.js. - -Accepts one CLI argument: the path to the JSON file containing the expressions to parse. -""" - -import ast -import json -import sys -import os - -base_scalar_types = { - "str", - "int", - "float", - "bool", - "bytearray", - "timedelta", - "None", -} - - -def parse_expression(ast_node, full_expression): - """ - Turns the AST expression object into a typedoc-compliant dict - """ - - current_node_type = ast_node.__class__.__name__ - - if current_node_type == "BinOp" and ast_node.op.__class__.__name__ == "BitOr": - return { - "type": "union", - "types": [ - parse_expression(ast_node.left, full_expression), - parse_expression(ast_node.right, full_expression), - ], - } - - if current_node_type == "Tuple": - return [parse_expression(e, full_expression) for e in ast_node.elts] - - if current_node_type == "Subscript": - if "id" in ast_node.value._fields and ast_node.value.id == "Annotated": - return parse_expression(ast_node.slice.dims[0], full_expression) - - main_type = parse_expression(ast_node.value, full_expression) - type_argument = parse_expression(ast_node.slice, full_expression) - - main_type["typeArguments"] = ( - type_argument if isinstance(type_argument, list) else [type_argument] - ) - return main_type - - if current_node_type == "Constant": - return {"type": "literal", "value": ast_node.value} - - # If the expression is not one of the types above, we simply print the expression - return { - "type": "reference", - "name": full_expression[ast_node.col_offset : ast_node.end_col_offset], - } - - -typedoc_types_path = sys.argv[1] - -with open(typedoc_types_path, "r") as f: - typedoc_out = {} - expressions = json.load(f) - - for expression in expressions: - try: - if typedoc_out.get(expression) is None: - typedoc_out[expression] = parse_expression( - ast.parse(expression).body[0].value, expression - ) - except Exception as e: - print(f"Invalid expression encountered while parsing: {expression}") - print(f"Error: {e}") - - with open(f"{os.path.splitext(typedoc_types_path)[0]}-parsed.json", "w") as f: - f.write(json.dumps(typedoc_out, indent=4)) diff --git a/website/pydoc-markdown.yml b/website/pydoc-markdown.yml deleted file mode 100644 index 200eebb462..0000000000 --- a/website/pydoc-markdown.yml +++ /dev/null @@ -1,14 +0,0 @@ -loaders: - - type: python - search_path: [../src] -processors: - - type: filter - skip_empty_modules: true - documented_only: false - - type: crossref -renderer: - type: docusaurus - docs_base_path: docs - relative_output_path: reference - relative_sidebar_path: sidebar.json - sidebar_top_level_label: null diff --git a/website/transformDocs.js b/website/transformDocs.js deleted file mode 100644 index 4a9dcd16b6..0000000000 --- a/website/transformDocs.js +++ /dev/null @@ -1,542 +0,0 @@ -/* eslint-disable */ - -const fs = require('fs'); -const { spawnSync } = require('child_process'); - -const moduleShortcuts = require('./module_shortcuts.json'); -const path = require('path'); - -const REPO_ROOT_PLACEHOLDER = 'REPO_ROOT_PLACEHOLDER'; - -const APIFY_CLIENT_REPO_URL = 'https://github.com/apify/apify-client-python'; -const APIFY_SDK_REPO_URL = 'https://github.com/apify/apify-sdk-python'; -const APIFY_SHARED_REPO_URL = 'https://github.com/apify/apify-shared-python'; -const CRAWLEE_PYTHON_REPO_URL = 'https://github.com/apify/crawlee-python'; - -const REPO_URL_PER_PACKAGE = { - 'apify': APIFY_SDK_REPO_URL, - 'apify_client': APIFY_CLIENT_REPO_URL, - 'apify_shared': APIFY_SHARED_REPO_URL, - 'crawlee': CRAWLEE_PYTHON_REPO_URL, -}; - -// For each package, get the installed version, and set the tag to the corresponding version -const TAG_PER_PACKAGE = {}; -for (const pkg of ['apify', 'apify_client', 'apify_shared']) { - const spawnResult = spawnSync('python', ['-c', `import ${pkg}; print(${pkg}.__version__)`]); - if (spawnResult.status === 0) { - TAG_PER_PACKAGE[pkg] = `v${spawnResult.stdout.toString().trim()}`; - } -} - -// For the current package, set the tag to 'master' -const thisPackagePyprojectToml = fs.readFileSync(path.join(__dirname, '..', '/pyproject.toml'), 'utf8'); -const thisPackageName = thisPackagePyprojectToml.match(/^name = "(.+)"$/m)[1]; -TAG_PER_PACKAGE[thisPackageName] = 'master'; - -// Taken from https://github.com/TypeStrong/typedoc/blob/v0.23.24/src/lib/models/reflections/kind.ts, modified -const TYPEDOC_KINDS = { - 'class': { - kind: 128, - kindString: 'Class', - }, - 'function': { - kind: 2048, - kindString: 'Method', - }, - 'data': { - kind: 1024, - kindString: 'Property', - }, - 'enum': { - kind: 8, - kindString: 'Enumeration', - }, - 'enumValue': { - kind: 16, - kindString: 'Enumeration Member', - }, -} - -const GROUP_ORDER = [ - 'Classes', - 'Abstract classes', - 'Data structures', - 'Errors', - 'Functions', - 'Constructors', - 'Methods', - 'Properties', - 'Constants', - 'Enumeration Members' -]; - -const groupSort = (g1, g2) => { - if(GROUP_ORDER.includes(g1) && GROUP_ORDER.includes(g2)){ - return GROUP_ORDER.indexOf(g1) - GROUP_ORDER.indexOf(g2) - } - return g1.localeCompare(g2); -}; - -function getGroupName(object) { - if (object.decorations?.some(d => d.name === 'docs_group')) { - return { - groupName: object.decorations.find(d => d.name === 'docs_group')?.args.slice(2,-2), - source: 'decorator' - } - } - - const groupPredicates = { - 'Methods': (x) => x.kindString === 'Method', - 'Constructors': (x) => x.kindString === 'Constructor', - 'Properties': (x) => x.kindString === 'Property', - 'Constants': (x) => x.kindString === 'Enumeration', - 'Enumeration Members': (x) => x.kindString === 'Enumeration Member', - }; - - const groupName = Object.entries(groupPredicates).find( - ([_, predicate]) => predicate(object) - )?.[0]; - - return { groupName, source: 'predicate' }; -} - -// Strips the Optional[] type from the type string, and replaces generic types with just the main type -function getBaseType(type) { - return type?.replace(/Optional\[(.*)\]/g, '$1').split('[')[0]; -} - -const typedocTypes = []; - -function parseTypes(typedocTypes) { - fs.writeFileSync( - path.join(__dirname, 'typedoc-types.raw'), - JSON.stringify( - typedocTypes - .map(x => x.name) - .filter(x=>x) - ) - ); - - spawnSync('python', ['parse_types.py', 'typedoc-types.raw']); - - const parsedTypes = JSON.parse( - fs.readFileSync( - path.join(__dirname, 'typedoc-types-parsed.json'), - 'utf8' - ) - ); - - for (type of typedocTypes) { - const parsedType = parsedTypes[type.name]; - - if (parsedType) { - for (const key in parsedType) { - type[key] = parsedType[key]; - } - } - } -} - -// Infer the Typedoc type from the docspec type -function inferTypedocType(docspecType) { - typedocTypes.push({ - name: docspecType?.replaceAll(/#.*/g, '').replaceAll('\n', '').trim() ?? docspecType, - type: 'reference', - }) - - return typedocTypes[typedocTypes.length - 1]; -} - -// Sorts the groups of a Typedoc member, and sorts the children of each group -function sortChildren(typedocMember) { - for (let group of typedocMember.groups) { - group.children - .sort((a, b) => { - const firstName = typedocMember.children.find(x => x.id === a || x.inheritedFrom?.target == a).name; - const secondName = typedocMember.children.find(x => x.id === b || x.inheritedFrom?.target == b).name; - return firstName.localeCompare(secondName); - }); - } - typedocMember.groups.sort((a, b) => groupSort(a.title, b.title)); -} - -// Objects with decorators named 'ignore_docs' will be ignored -function isHidden(member) { - return member.decorations?.some(d => d.name === 'ignore_docs') || member.name === 'ignore_docs'; -} - -// Each object in the Typedoc structure has an unique ID, -// we'll just increment it for each object we convert -let oid = 1; - -const symbolIdMap = []; - -const contextStack = []; -const getContext = () => contextStack[contextStack.length - 1]; -const popContext = () => contextStack.pop(); -const newContext = (context) => contextStack.push(context); - -const forwardAncestorRefs = new Map(); -const backwardAncestorRefs = new Map(); - -function injectInheritedChildren(ancestor, descendant) { - descendant.children = descendant.children ?? []; - - for (const inheritedChild of ancestor.children ?? []) { - let ownChild = descendant.children?.find((x) => x.name === inheritedChild.name); - - if (!ownChild) { - const childId = oid++; - - const { groupName } = getGroupName(inheritedChild); - if (!groupName) { - throw new Error(`Couldn't resolve the group name for ${inheritedChild.name} (inherited child of ${ancestor.name})`); - } - - const group = descendant.groups.find((g) => g.title === groupName); - - if (group) { - group.children.push(inheritedChild.id); - } else { - descendant.groups.push({ - title: groupName, - children: [inheritedChild.id], - }); - } - - descendant.children.push({ - ...inheritedChild, - id: childId, - inheritedFrom: { - type: "reference", - target: inheritedChild.id, - name: `${ancestor.name}.${inheritedChild.name}`, - } - }); - } else if (!ownChild.comment.summary[0].text) { - ownChild.inheritedFrom = { - type: "reference", - target: inheritedChild.id, - name: `${ancestor.name}.${inheritedChild.name}`, - } - - for (let key in inheritedChild) { - if(key !== 'id' && key !== 'inheritedFrom') { - ownChild[key] = inheritedChild[key]; - } - } - } - } -} - - -// Converts a docspec object to a Typedoc object, including all its children -function convertObject(obj, parent, module) { - const rootModuleName = module.name.split('.')[0]; - for (let member of obj.members ?? []) { - let typedocKind = TYPEDOC_KINDS[member.type]; - - if(member.bases?.includes('Enum')) { - typedocKind = TYPEDOC_KINDS['enum']; - } - - let typedocType = inferTypedocType(member.datatype); - - if (member.decorations?.some(d => ['property', 'dualproperty'].includes(d.name))) { - typedocKind = TYPEDOC_KINDS['data']; - typedocType = inferTypedocType(member.return_type ?? member.datatype); - } - - if(parent.kindString === 'Enumeration') { - typedocKind = TYPEDOC_KINDS['enumValue']; - typedocType = { - type: 'literal', - value: member.value, - } - } - - if(member.type in TYPEDOC_KINDS && !isHidden(member)) { - // Get the URL of the member in GitHub - const repoBaseUrl = `${REPO_URL_PER_PACKAGE[rootModuleName]}/blob/${TAG_PER_PACKAGE[rootModuleName]}`; - const filePathInRepo = member.location.filename.replace(REPO_ROOT_PLACEHOLDER, ''); - const fileGitHubUrl = member.location.filename.replace(REPO_ROOT_PLACEHOLDER, repoBaseUrl); - const memberGitHubUrl = `${fileGitHubUrl}#L${member.location.lineno}`; - - symbolIdMap.push({ - qualifiedName: member.name, - sourceFileName: filePathInRepo, - }); - - // Get the module name of the member, and check if it has a shortcut (reexport from an ancestor module) - const fullName = `${module.name}.${member.name}`; - let moduleName = module.name; - if (fullName in moduleShortcuts) { - moduleName = moduleShortcuts[fullName].replace(`.${member.name}`, ''); - } - - if (member.name === '_ActorType') { - member.name = 'Actor'; - } - - let docstring = { text: member.docstring?.content ?? '' }; - try { - docstring = JSON.parse(docstring.text); - - docstring.args = docstring.sections.find((section) => Object.keys(section)[0] === 'Arguments')['Arguments'] ?? []; - - docstring.args = docstring.args.reduce((acc, arg) => { - acc[arg.param] = arg.desc; - return acc; - }, {}); - - docstring.returns = docstring.sections.find((section) => Object.keys(section)[0] === 'Returns')['Returns'] ?? []; - - docstring.returns = docstring.returns.join('\n'); - } catch { - // Do nothing - } - - if (!docstring.text) { - docstring.text = getContext()?.args?.[member.name] ?? ''; - } - - // Create the Typedoc member object - let typedocMember = { - id: oid++, - name: member.name, - module: moduleName, // This is an extension to the original Typedoc structure, to support showing where the member is exported from - ...typedocKind, - flags: {}, - comment: docstring ? { - summary: [{ - kind: 'text', - text: docstring.text, - }], - } : undefined, - type: typedocType, - decorations: member.decorations?.map(({ name, args }) => ({ name, args })), - children: [], - groups: [], - sources: [{ - filename: filePathInRepo, - line: member.location.lineno, - character: 1, - url: memberGitHubUrl, - }], - }; - - if(typedocMember.kindString === 'Method') { - typedocMember.signatures = [{ - id: oid++, - name: member.name, - modifiers: member.modifiers ?? [], - kind: 4096, - kindString: 'Call signature', - flags: {}, - comment: docstring.text ? { - summary: [{ - kind: 'text', - text: docstring?.text, - }], - blockTags: docstring?.returns ? [ - { tag: '@returns', content: [{ kind: 'text', text: docstring.returns }] }, - ] : undefined, - } : undefined, - type: inferTypedocType(member.return_type), - parameters: member.args.filter((arg) => (arg.name !== 'self' && arg.name !== 'cls')).map((arg) => ({ - id: oid++, - name: arg.name, - kind: 32768, - kindString: 'Parameter', - flags: { - isOptional: arg.datatype?.includes('Optional') ? 'true' : undefined, - 'keyword-only': arg.type === 'KEYWORD_ONLY' ? 'true' : undefined, - }, - type: inferTypedocType(arg.datatype), - comment: docstring.args?.[arg.name] ? { - summary: [{ - kind: 'text', - text: docstring.args[arg.name] - }] - } : undefined, - defaultValue: arg.default_value, - })), - }]; - } - - if(typedocMember.name === '__init__') { - typedocMember.kind = 512; - typedocMember.kindString = 'Constructor'; - } - - convertObject(member, typedocMember, module); - - if (typedocMember.kindString === 'Class') { - newContext(docstring); - - backwardAncestorRefs.set(member.name, typedocMember); - - if (member.bases?.length > 0) { - member.bases.forEach((base) => { - const unwrappedBaseType = getBaseType(base); - - const baseTypedocMember = backwardAncestorRefs.get(unwrappedBaseType); - if (baseTypedocMember) { - typedocMember.extendedTypes = [ - ...typedocMember.extendedTypes ?? [], - { - type: 'reference', - name: baseTypedocMember.name, - target: baseTypedocMember.id, - } - ]; - - baseTypedocMember.extendedBy = [ - ...baseTypedocMember.extendedBy ?? [], - { - type: 'reference', - name: typedocMember.name, - target: typedocMember.id, - } - ]; - - injectInheritedChildren(baseTypedocMember, typedocMember); - } else { - forwardAncestorRefs.set( - unwrappedBaseType, - [...(forwardAncestorRefs.get(unwrappedBaseType) ?? []), typedocMember], - ); - } - }); - } - } - - if (typedocMember.kindString === 'Class') { - popContext(); - } - - const { groupName, source: groupSource } = getGroupName(typedocMember); - - if (groupName) { - // Use the decorator classes everytime, but don't render the class-level groups for the root project - if (groupSource === 'decorator' || parent.kindString !== 'Project') { - const group = parent.groups.find((g) => g.title === groupName); - if (group) { - group.children.push(typedocMember.id); - } else { - parent.groups.push({ - title: groupName, - children: [typedocMember.id], - }); - } - } - } - - parent.children.push(typedocMember); - - sortChildren(typedocMember); - - if (typedocMember.kindString === 'Class') { - forwardAncestorRefs.get(typedocMember.name)?.forEach((descendant) => { - descendant.extendedTypes = [ - ...descendant.extendedTypes ?? [], - { - type: 'reference', - name: typedocMember.name, - target: typedocMember.id, - } - ]; - - typedocMember.extendedBy = [ - ...typedocMember.extendedBy ?? [], - { - type: 'reference', - name: descendant.name, - target: descendant.id, - } - ] - - injectInheritedChildren(typedocMember, descendant); - - sortChildren(descendant); - }); - } - } - } -} - -// Recursively traverse a javascript POJO object, if it contains both 'name' and 'type : reference' keys, add the 'target' key -// with the corresponding id of the object with the same name - -function fixRefs(obj, namesToIds) { - for (const key in obj) { - if (key === 'name' && obj?.type === 'reference' && namesToIds[obj?.name]) { - obj.target = namesToIds[obj?.name]; - } - if (typeof obj[key] === 'object' && obj[key] !== null) { - fixRefs(obj[key], namesToIds); - } - } -} - -function main() { - // Root object of the Typedoc structure - const typedocApiReference = { - 'id': 0, - 'name': 'apify-client', - 'kind': 1, - 'kindString': 'Project', - 'flags': {}, - 'originalName': '', - 'children': [], - 'groups': [], - 'sources': [ - { - 'fileName': 'src/index.ts', - 'line': 1, - 'character': 0, - 'url': `http://example.com/blob/123456/src/dummy.py`, - } - ] - }; - - // Load the docspec dump files of this module and of apify-shared - const thisPackageDocspecDump = fs.readFileSync(path.join(__dirname, 'docspec-dump.jsonl'), 'utf8'); - const thisPackageModules = JSON.parse(thisPackageDocspecDump) - - // Convert all the modules, store them in the root object - for (const module of thisPackageModules) { - convertObject(module, typedocApiReference, module); - }; - - // Runs the Python AST parser on the collected types to get rich type information - parseTypes(typedocTypes); - - // Recursively fix references (collect names->ids of all the named entities and then inject those in the reference objects) - const namesToIds = {}; - function collectIds(obj) { - for (const child of obj.children ?? []) { - namesToIds[child.name] = child.id; - collectIds(child); - } - } - collectIds(typedocApiReference); - fixRefs(typedocApiReference, namesToIds); - - // Sort the children of the root object - sortChildren(typedocApiReference); - - typedocApiReference.symbolIdMap = Object.fromEntries(Object.entries(symbolIdMap)); - - // Write the Typedoc structure to the output file - fs.writeFileSync(path.join(__dirname, 'api-typedoc-generated.json'), JSON.stringify(typedocApiReference, null, 4)); -} - -if (require.main === module) { - main(); -} - -module.exports = { - groupSort, -} diff --git a/website/yarn.lock b/website/yarn.lock index c1a19fa2c8..7f7cea5d78 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -223,25 +223,26 @@ __metadata: languageName: node linkType: hard -"@apify/docusaurus-plugin-typedoc-api@npm:^4.2.7": - version: 4.2.7 - resolution: "@apify/docusaurus-plugin-typedoc-api@npm:4.2.7" +"@apify/docusaurus-plugin-typedoc-api@npm:^4.3.0": + version: 4.3.0 + resolution: "@apify/docusaurus-plugin-typedoc-api@npm:4.3.0" dependencies: "@docusaurus/plugin-content-docs": "npm:^3.5.2" "@docusaurus/types": "npm:^3.5.2" "@docusaurus/utils": "npm:^3.5.2" "@types/react": "npm:^18.3.11" "@vscode/codicons": "npm:^0.0.35" + html-entities: "npm:2.3.2" marked: "npm:^9.1.6" marked-smartypants: "npm:^1.1.5" - typedoc: "npm:^0.25.7" + typedoc: "npm:^0.26.11" zx: "npm:^8.1.4" peerDependencies: "@docusaurus/core": ^3.5.2 "@docusaurus/mdx-loader": ^3.5.2 react: ">=18.0.0" typescript: ^5.0.0 - checksum: 10c0/0ed51d0b454bb476ee72b9a6fd57eabd1ccfff20c56f0a713eab38d059c5cca1254b7b310d71a05b1b4e6c936c118ea261d59ff3e3a40724aed7a43b9d5c8940 + checksum: 10c0/31a98cbe31a014f8337c0086d6685841d2e411e28007c28ec422f06f41de3707ce7200cf71fde0d7589260b529ed9d8b76715ca919b8bccf46b08a047eb34949 languageName: node linkType: hard @@ -2559,6 +2560,58 @@ __metadata: languageName: node linkType: hard +"@shikijs/core@npm:1.23.1": + version: 1.23.1 + resolution: "@shikijs/core@npm:1.23.1" + dependencies: + "@shikijs/engine-javascript": "npm:1.23.1" + "@shikijs/engine-oniguruma": "npm:1.23.1" + "@shikijs/types": "npm:1.23.1" + "@shikijs/vscode-textmate": "npm:^9.3.0" + "@types/hast": "npm:^3.0.4" + hast-util-to-html: "npm:^9.0.3" + checksum: 10c0/3f0d343322aad8ecdaa3dd416e613113bd9fce608495e5c3c0e3e492abcd8f5c7011bf939d3fc11a907e0b402921df2d3dee985fac2e2b3e6013fe29709f81cf + languageName: node + linkType: hard + +"@shikijs/engine-javascript@npm:1.23.1": + version: 1.23.1 + resolution: "@shikijs/engine-javascript@npm:1.23.1" + dependencies: + "@shikijs/types": "npm:1.23.1" + "@shikijs/vscode-textmate": "npm:^9.3.0" + oniguruma-to-es: "npm:0.4.1" + checksum: 10c0/a8e3b941c9016a8ad62590a551a9f613b45f3267855880773eb61309e6d2b3bfc6248a1812b80b95b6335fb25ae5ad433eb3e6308d6061860865e9f882850621 + languageName: node + linkType: hard + +"@shikijs/engine-oniguruma@npm:1.23.1": + version: 1.23.1 + resolution: "@shikijs/engine-oniguruma@npm:1.23.1" + dependencies: + "@shikijs/types": "npm:1.23.1" + "@shikijs/vscode-textmate": "npm:^9.3.0" + checksum: 10c0/834f64cb66c844763ae44f481d55c361f851ae0deec0edfb00e1de05959b6672cbfd9189a1c5943beacfb66468d6a2c788b8f5874360e80dc417109117e86d3a + languageName: node + linkType: hard + +"@shikijs/types@npm:1.23.1": + version: 1.23.1 + resolution: "@shikijs/types@npm:1.23.1" + dependencies: + "@shikijs/vscode-textmate": "npm:^9.3.0" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/5360e5ff777e5945137ca6bf9aab8ea5d30632ccf648825e67908d1840cac7ab9fc25b5bc321e99a7120f454cf3639a8ab252568010c7dc5a260744bfa0a5352 + languageName: node + linkType: hard + +"@shikijs/vscode-textmate@npm:^9.3.0": + version: 9.3.0 + resolution: "@shikijs/vscode-textmate@npm:9.3.0" + checksum: 10c0/6aa80798b7d7f8be8029bb397ce1b9b75c0d0963d6aa444b9ae165595ceee931cf3767ca1681ba71a6e27484eeccab584bd38db3420da477f1a8d745040b1b1f + languageName: node + linkType: hard + "@sideway/address@npm:^4.1.5": version: 4.1.5 resolution: "@sideway/address@npm:4.1.5" @@ -2911,7 +2964,7 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^3.0.0": +"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" dependencies: @@ -3750,13 +3803,6 @@ __metadata: languageName: node linkType: hard -"ansi-sequence-parser@npm:^1.1.0": - version: 1.1.1 - resolution: "ansi-sequence-parser@npm:1.1.1" - checksum: 10c0/ab2259ccf69f145ecf1418d4e71524158828f44afdf37c7536677871f4cebaa8b176fcb95de8f94a68129357dddc59586597da25f9d4ebf9968f6ef022bf0b31 - languageName: node - linkType: hard - "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -5004,7 +5050,7 @@ __metadata: version: 0.0.0-use.local resolution: "crawlee@workspace:." dependencies: - "@apify/docusaurus-plugin-typedoc-api": "npm:^4.2.7" + "@apify/docusaurus-plugin-typedoc-api": "npm:^4.3.0" "@apify/eslint-config-ts": "npm:^0.4.0" "@apify/tsconfig": "npm:^0.1.0" "@apify/utilities": "npm:^2.8.0" @@ -5823,6 +5869,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex-xs@npm:^1.0.0": + version: 1.0.0 + resolution: "emoji-regex-xs@npm:1.0.0" + checksum: 10c0/1082de006991eb05a3324ef0efe1950c7cdf66efc01d4578de82b0d0d62add4e55e97695a8a7eeda826c305081562dc79b477ddf18d886da77f3ba08c4b940a0 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -7513,6 +7566,25 @@ __metadata: languageName: node linkType: hard +"hast-util-to-html@npm:^9.0.3": + version: 9.0.3 + resolution: "hast-util-to-html@npm:9.0.3" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + ccount: "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-whitespace: "npm:^3.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + stringify-entities: "npm:^4.0.0" + zwitch: "npm:^2.0.4" + checksum: 10c0/af938a03034727f6c944d3855732d72f71a3bcd920d36b9ba3e083df2217faf81713740934db64673aca69d76b60abe80052e47c0702323fd0bd5dce03b67b8d + languageName: node + linkType: hard + "hast-util-to-jsx-runtime@npm:^2.0.0": version: 2.3.2 resolution: "hast-util-to-jsx-runtime@npm:2.3.2" @@ -7628,6 +7700,13 @@ __metadata: languageName: node linkType: hard +"html-entities@npm:2.3.2": + version: 2.3.2 + resolution: "html-entities@npm:2.3.2" + checksum: 10c0/69b50d032435e02765175d40ac3d94ceeb19b3ee32b869f79804f24f8efadf7928a1c3c4eddb85273809f95f7cffa416d05ca43e88d219575e8c5f6dd75bfc8d + languageName: node + linkType: hard + "html-entities@npm:^2.3.2": version: 2.5.2 resolution: "html-entities@npm:2.5.2" @@ -8739,13 +8818,6 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.3.1 - resolution: "jsonc-parser@npm:3.3.1" - checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -8876,6 +8948,15 @@ __metadata: languageName: node linkType: hard +"linkify-it@npm:^5.0.0": + version: 5.0.0 + resolution: "linkify-it@npm:5.0.0" + dependencies: + uc.micro: "npm:^2.0.0" + checksum: 10c0/ff4abbcdfa2003472fc3eb4b8e60905ec97718e11e33cca52059919a4c80cc0e0c2a14d23e23d8c00e5402bc5a885cdba8ca053a11483ab3cc8b3c7a52f88e2d + languageName: node + linkType: hard + "lit-element@npm:^4.1.0": version: 4.1.1 resolution: "lit-element@npm:4.1.1" @@ -9086,6 +9167,22 @@ __metadata: languageName: node linkType: hard +"markdown-it@npm:^14.1.0": + version: 14.1.0 + resolution: "markdown-it@npm:14.1.0" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:^4.4.0" + linkify-it: "npm:^5.0.0" + mdurl: "npm:^2.0.0" + punycode.js: "npm:^2.3.1" + uc.micro: "npm:^2.1.0" + bin: + markdown-it: bin/markdown-it.mjs + checksum: 10c0/9a6bb444181d2db7016a4173ae56a95a62c84d4cbfb6916a399b11d3e6581bf1cc2e4e1d07a2f022ae72c25f56db90fbe1e529fca16fbf9541659dc53480d4b4 + languageName: node + linkType: hard + "markdown-table@npm:^3.0.0": version: 3.0.3 resolution: "markdown-table@npm:3.0.3" @@ -9104,15 +9201,6 @@ __metadata: languageName: node linkType: hard -"marked@npm:^4.3.0": - version: 4.3.0 - resolution: "marked@npm:4.3.0" - bin: - marked: bin/marked.js - checksum: 10c0/0013463855e31b9c88d8bb2891a611d10ef1dc79f2e3cbff1bf71ba389e04c5971298c886af0be799d7fa9aa4593b086a136062d59f1210b0480b026a8c5dc47 - languageName: node - linkType: hard - "marked@npm:^9.1.6": version: 9.1.6 resolution: "marked@npm:9.1.6" @@ -9399,6 +9487,13 @@ __metadata: languageName: node linkType: hard +"mdurl@npm:^2.0.0": + version: 2.0.0 + resolution: "mdurl@npm:2.0.0" + checksum: 10c0/633db522272f75ce4788440669137c77540d74a83e9015666a9557a152c02e245b192edc20bc90ae953bbab727503994a53b236b4d9c99bdaee594d0e7dd2ce0 + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -10071,7 +10166,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -10492,6 +10587,17 @@ __metadata: languageName: node linkType: hard +"oniguruma-to-es@npm:0.4.1": + version: 0.4.1 + resolution: "oniguruma-to-es@npm:0.4.1" + dependencies: + emoji-regex-xs: "npm:^1.0.0" + regex: "npm:^5.0.0" + regex-recursion: "npm:^4.2.1" + checksum: 10c0/342ca92840f62be23252d9834ba07e85bf1a8d2962fef348d0fd0d49038776be338796662665ff602ee452215d01ab0cad92b4454cd7310e33a8c32c0e1d3dec + languageName: node + linkType: hard + "open@npm:^7.4.2": version: 7.4.2 resolution: "open@npm:7.4.2" @@ -11540,6 +11646,13 @@ __metadata: languageName: node linkType: hard +"punycode.js@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode.js@npm:2.3.1" + checksum: 10c0/1d12c1c0e06127fa5db56bd7fdf698daf9a78104456a6b67326877afc21feaa821257b171539caedd2f0524027fa38e67b13dd094159c8d70b6d26d2bea4dfdb + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -11946,6 +12059,31 @@ __metadata: languageName: node linkType: hard +"regex-recursion@npm:^4.2.1": + version: 4.2.1 + resolution: "regex-recursion@npm:4.2.1" + dependencies: + regex-utilities: "npm:^2.3.0" + checksum: 10c0/6dee0bccfe1e687da4a51a22526aa72c74ca4fcca55851428fe89b040e45d763933833652727e5074a1c704b7313d77304fe1cdba67382e2d97db62bbe701096 + languageName: node + linkType: hard + +"regex-utilities@npm:^2.3.0": + version: 2.3.0 + resolution: "regex-utilities@npm:2.3.0" + checksum: 10c0/78c550a80a0af75223244fff006743922591bd8f61d91fef7c86b9b56cf9bbf8ee5d7adb6d8991b5e304c57c90103fc4818cf1e357b11c6c669b782839bd7893 + languageName: node + linkType: hard + +"regex@npm:^5.0.0": + version: 5.0.2 + resolution: "regex@npm:5.0.2" + dependencies: + regex-utilities: "npm:^2.3.0" + checksum: 10c0/a9bc88a4b4cfb14a1c273312bb81c1bea5869648810bfb66353aa1ba6ce8bc8967559203eff3e20992c2696af41ed161872b9c49885503ea1c78f8433a9def81 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": version: 1.5.3 resolution: "regexp.prototype.flags@npm:1.5.3" @@ -12665,15 +12803,17 @@ __metadata: languageName: node linkType: hard -"shiki@npm:^0.14.7": - version: 0.14.7 - resolution: "shiki@npm:0.14.7" +"shiki@npm:^1.16.2": + version: 1.23.1 + resolution: "shiki@npm:1.23.1" dependencies: - ansi-sequence-parser: "npm:^1.1.0" - jsonc-parser: "npm:^3.2.0" - vscode-oniguruma: "npm:^1.7.0" - vscode-textmate: "npm:^8.0.0" - checksum: 10c0/5c7fcbb870d0facccc7ae2f3410a28121f8e0b3f298e4e956de817ad6ab60a4c7e20a9184edfe50a93447addbb88b95b69e6ef88ac16ac6ca3e94c50771a6459 + "@shikijs/core": "npm:1.23.1" + "@shikijs/engine-javascript": "npm:1.23.1" + "@shikijs/engine-oniguruma": "npm:1.23.1" + "@shikijs/types": "npm:1.23.1" + "@shikijs/vscode-textmate": "npm:^9.3.0" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/7c2bcc800fb986a1856a9859c694194d22449bc0a7f964e1fad8a713246257a58606b0a0e35d25b07a51f52d51737f1415d882090e74a94672ebb6d9bbe2cf88 languageName: node linkType: hard @@ -13508,19 +13648,20 @@ __metadata: languageName: node linkType: hard -"typedoc@npm:^0.25.7": - version: 0.25.13 - resolution: "typedoc@npm:0.25.13" +"typedoc@npm:^0.26.11": + version: 0.26.11 + resolution: "typedoc@npm:0.26.11" dependencies: lunr: "npm:^2.3.9" - marked: "npm:^4.3.0" - minimatch: "npm:^9.0.3" - shiki: "npm:^0.14.7" + markdown-it: "npm:^14.1.0" + minimatch: "npm:^9.0.5" + shiki: "npm:^1.16.2" + yaml: "npm:^2.5.1" peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x bin: typedoc: bin/typedoc - checksum: 10c0/13878e6a9fc2b65d65e3b514efa11b43bdfd57149861cefc4a969ec213f4bc4b36ee9239d0b654ae18bcbbd5174206d409383f9000b7bdea22da1945f7ac91de + checksum: 10c0/441104f1215af8d7589375691afc993bea1fab7c9b7b91ead22781e994f9f21a7a779a283dc42d72260171164185fad7dbcf61166b0442107d9c7decb84b2aee languageName: node linkType: hard @@ -13544,6 +13685,13 @@ __metadata: languageName: node linkType: hard +"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": + version: 2.1.0 + resolution: "uc.micro@npm:2.1.0" + checksum: 10c0/8862eddb412dda76f15db8ad1c640ccc2f47cdf8252a4a30be908d535602c8d33f9855dfcccb8b8837855c1ce1eaa563f7fa7ebe3c98fd0794351aab9b9c55fa + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -13857,20 +14005,6 @@ __metadata: languageName: node linkType: hard -"vscode-oniguruma@npm:^1.7.0": - version: 1.7.0 - resolution: "vscode-oniguruma@npm:1.7.0" - checksum: 10c0/bef0073c665ddf8c86e51da94529c905856559e9aba97a9882f951acd572da560384775941ab6e7e8db94d9c578b25fefb951e4b73c37e8712e16b0231de2689 - languageName: node - linkType: hard - -"vscode-textmate@npm:^8.0.0": - version: 8.0.0 - resolution: "vscode-textmate@npm:8.0.0" - checksum: 10c0/836f7fe73fc94998a38ca193df48173a2b6eab08b4943d83c8cac9a2a0c3546cfdab4cf1b10b890ec4a4374c5bee03a885ef0e83e7fd2bd618cf00781c017c04 - languageName: node - linkType: hard - "watchpack@npm:^2.4.1": version: 2.4.2 resolution: "watchpack@npm:2.4.2" @@ -14300,6 +14434,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.5.1": + version: 2.6.1 + resolution: "yaml@npm:2.6.1" + bin: + yaml: bin.mjs + checksum: 10c0/aebf07f61c72b38c74d2b60c3a3ccf89ee4da45bcd94b2bfb7899ba07a5257625a7c9f717c65a6fc511563d48001e01deb1d9e55f0133f3e2edf86039c8c1be7 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -14314,7 +14457,7 @@ __metadata: languageName: node linkType: hard -"zwitch@npm:^2.0.0": +"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4" checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e